PHP library

提供:senooken JP Wiki
2025年1月30日 (木) 11:24時点におけるSenooken (トーク | 投稿記録)による版 (→‎CSSのコンポーネント)

Framework

  • Symfony
  • CakePHP
  • FuelPHP: 2010年誕生。
  • Codeigniter: シンプル、軽量。
  • Zend
  • Laravel: 2011年誕生。
  • Phalcon: 高速で有名。
  • Yii - Wikipedia
 素直にPhalconを使うのが安定ではないか?ああ、C拡張が必要だから、共用サーバーへのインストールで困る。

Template

いろいろある。

  • Blade: Laravel標準。
  • DIV: 1ファイルでシンプル。大規模には向かない。
  • Smarty: 万能。
  • Twig: 拡張はしにくい。
 使うとしたら、歴史の長いSmarty。

高速らしい。

そもそもテンプレートエンジンがいるのかどうかという議論がある。

UI/UXを突き詰めると、JavaScriptを使わざるを得ず、サーバーテンプレートエンジンは初回だけなので、いっそのことJSで全部やろうというのが最近の流れの模様。

PHP自体が一種のテンプレートエンジンという主張がある。が、関数をあれこれ書く必要があり、可読性が悪い。

SmartyよりTwigのほうが性能が上とか。

Volt: テンプレートエンジン — Phalcon 3.0.2 ドキュメント (Japanese / 日本語)」。高速フレームワークのPhalconではVoltを使っている。

Twig

Twig v3のほうが速いらしいが、Smarty v3のほうが速いというデータもある。

Smarty

Pure PHP/HTML views VS template engines views - Stack Overflow」が決定的だった。Smartyの開発者がSmartyのほうがTwigより速いと回答していた。2012年。Smartyでいいと思う。

カスタムタグ

https://chatgpt.com/c/6789e2f7-6df0-800b-ac87-2254034abd4e

関数プラグイン{function}とブロックプラグイン{block}の2種類で独自のタグを定義できる。

{function} - Smarty Documentation

{block} - Smarty Documentation

デフォルトのプラグインディレクトリー (plugins) にfunciton.<function-name>.phpとして保存して使う。

7. Builtin-in Functions

{capture}

{capture} | Smarty

ブロック内を変数に押し込めるための機能。

{capture name="<name>"}
{/capture}

nameで指定した<name>にcapture内が入る。

nameを指定しない場合、defaultとみなされる。

  • name
  • assign
  • append

特にappendのパラメーターが重要。これを使うことでcssやjsを共通のheaderの共通部分に押し込める。

captureの内容を参照する場合は、$smarty.capture.<name>で参照する。

capture appendで変数名を指定する。Smarty 3.1からはこの変数が自動結合されている。

3.1未満の場合、配列になっているので使う際にforeachなどが必要。

{literal}

https://chatgpt.com/c/6799d1f8-dd54-800b-a5cc-b22c453083fb

{などはSmartyのタグとして解釈される部分では解釈される。CSSやJavaScriptなどで{をそのまま使いたい場合、{literal}タグで解釈を阻止できる。

ただ、{literal}が不要なケースもある。capture/block内。これらがliteral相当の機能がある。

{strip}

{strip} | Smarty

tpl内の空白空行を除去して1行でHTMLを表示する。tpl内のコードの可読性を確保しながら、結果に余計な空白を作らない。

html要素の前後を{strip}で囲むのが基本的な使用方法。

{* the following will be all run into one line upon output *}
{strip}
<table border='0'>
 <tr>
  <td>
   <a href="{$url}">
    <font color="red">This is a test</font>
   </a>
  </td>
 </tr>
</table>
{/strip}

なお、{strip}は変数には影響を与えない。変数内に作用したければ、strip修飾子を使う。

Other

Version

https://chatgpt.com/c/6799d1f8-dd54-800b-a5cc-b22c453083fb

// .tpl
{$smarty.version}
phpinfo();
require_once('libs/Smarty.class.php');

$smarty = new Smarty();
echo 'Smarty Version: ' . $smarty->getVersion();
CSSのコンポーネント

Smartyでコンポーネント単位でCSSを適用したい。

https://chatgpt.com/c/6799d1f8-dd54-800b-a5cc-b22c453083fb

CSSはhead要素のstyleに置くしかないのをどうにか1ファイル単位で管理したい。

できれば1個のtplファイルでHTML/CSS/JSをコンポーネントとして扱えるといい。最悪インラインCSSでも。

AIに質問したら、CSSだけのファイルをtplに固めてheader.tplでhead要素内に配置するといういまいちな回答。

  • captureでglobalヘッダーに追記。
  • block
  • assignで変数に設定。

captureとblockがいい。appendでスタイルを追記できる。

extendsしているならblockでいい。extendsしていなくてincludeでやっているなら、captureでやる。

    <style>
        {foreach from=$styles item=style}
            {$style}
        {/foreach}
    </style>
{capture append='styles'}{literal}
.js_marquee_challenge_title {
    position: relative;
    width: 260px;
    height: 33px;
    margin: 0 auto;
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
}
{/literal}{/capture}

smarty v2だと配列になるのでforeachでやる。

captureが{を解釈するのでliteralでやる。

問題。base.tplでheader.tplとcomponent.tplをincludeすると、component.tplの変数がheader.tplに反映されない。

  1. postfilterでbody以下に登場するstyle/cssをheadの直前に配置するなどする。
  2. インラインCSSで対応。

インラインCSSで対応できる分はこれで対応したらいいと思う。インラインCSSでどうにもできないケースになったら、そのときに考える。

ORM

Ref:

いろいろある。Doctrineが有名。

  • Doctrine: Symfonyで採用。有名。
  • Eloquent
  • Propel: Symfony v1.2で採用されていた。
  • PHP activerecord
  • PHPDAO
  • PDO: PHP標準。
  • Xyster
 ただ、速度を優先する場合、PDOが最速になるらしい。

ORMは別になくてもいいか。いや、validateなどでほしいか。

ChatGPT: PHPのORMで最高速なのはどれ?


PHPのORMで「最高速」を目指す場合、目的やデータ量、柔軟性や機能性のニーズによって適切な選択肢が変わります。ただ、以下は一般的に高速性が評価されているORMやアプローチです。

      1. 1. **Cycle ORM**

- **概要**: Cycle ORMは、PHP向けに軽量で高性能なORMとして設計されており、メモリ使用量やクエリ生成において優れた最適化がなされています。また、`DataMapper`パターンを採用しており、柔軟性が高く、複雑なデータ構造にも対応可能です。

- **特徴**:

- メモリ効率が良く、データベースへのアクセスが高速。

- マッピング定義が柔軟で、データベーススキーマの同期などの管理機能も備えている。

- **適合するケース**: 高速性が求められるが、複雑なデータ構造やリレーションも必要な場合。

- **URL**: [Cycle ORM](https://cycle-orm.dev/)

      1. 2. **Doctrine ORM(高度に最適化した場合)**

- **概要**: Doctrineは多機能で、エンタープライズレベルのアプリケーションにも使用されていますが、設定やキャッシュの適切な調整で高速化が可能です。Doctrineは大規模なデータベースや複雑なエンティティ構造を扱うことを得意としており、クエリキャッシュやメタデータキャッシュを活用すると、高速なクエリ処理が実現できます。

- **特徴**:

- キャッシュ(メタデータ、クエリ、結果)を駆使することでパフォーマンスが向上。

- バッチ処理やフェッチモードの調整により、余分なSQLクエリを抑制できる。

- **適合するケース**: 大規模なアプリケーションで、柔軟性や機能性と高速性のバランスが求められる場合。

- **URL**: [Doctrine ORM](https://www.doctrine-project.org/projects/orm.html)

      1. 3. **Eloquent ORM(軽量化する場合)**

- **概要**: Eloquentは、Laravelの標準ORMで、柔軟で書きやすいAPIを提供しています。ただし、Eloquentは`Active Record`パターンを採用しているため、大量のデータや複雑なクエリには向きません。しかし、シンプルなアプリケーションであれば、十分な速度を発揮できます。

- **特徴**:

- データベースアクセスが少ないケースで非常に簡便で高パフォーマンス。

- 適切なスコープやクエリビルダーを利用することで高速なデータアクセスが可能。

- **適合するケース**: シンプルなアプリケーションで、多少の軽量化(不必要なEloquentモデルの削除など)を行い、APIの利便性と速度を両立したい場合。

- **URL**: [Eloquent ORM](https://laravel.com/docs/eloquent)

      1. 4. **直接的なクエリビルダー使用(PDO, Laminas DBなど)**

- **概要**: ORMを使わず、PDOやクエリビルダー(Laminas DBなど)を用いて、データベースと直接やり取りすることも非常に高速な手法です。ORMのオーバーヘッドがないため、特にトランザクション内での多くのデータ操作が求められる場合や、複雑なクエリが必要な場面では、これが最速のアプローチです。

- **特徴**:

- ORMを介さず直接データベースを操作するため、最小限のオーバーヘッドで済む。

- 柔軟で高度なクエリやバッチ操作も容易。

- **適合するケース**: 速度重視の大規模アプリケーションや、複雑なクエリが必要なケース。

これらを総合的に考えると、 **「Cycle ORM」** が最もバランスよく高性能を発揮しやすく、ORMの利便性を保持しながらも高速なデータ操作が可能です。しかし、最高速を求めるのであれば、ORMを使わずにクエリビルダーやPDOを直接活用することが理想的です。

Cycle ORMが安定して速いらしい。これでいくか。

Migrate

PHPで「Doctrine Migrations」を使ってみる

CakePHPに採用されているPhinxのほうが人気なのでPhinxを使ったほうがよいだろう。

ORMとあわせたほうがいいかも。

Test

  • PHPUnit

Search

検索キーワードをフォームから受信後、DBにSQLで検索をかけて取得結果を返すのが基本。

それとは別に、検索用のアプリにリクエストを受け渡しして検索するという方法がある。どちらでもいけるような、ドライバーのライブラリーがある。

検索サービスで有名なのは以下。

 Laravel Scoutでtntsearchを使う方法がある (Laravel Scout + TNTSearchによる小規模プロジェクトへの全文検索機能の追加 #PHP - Qiita/Laravel ScoutとTNTSearchを使用してサイト全文検索を実装してみる – helog)。

Packagist」の検索結果をみても、tntsearchが特に人気の模様。