[FuelPHP]Windowsだと問題ないのにLinux上だとClass not foundエラーが出るときにチェックすること

Windowだとクラスのロードが問題なく行えるのに、Linux上だとクラスのロードでエラーになる場合は、ファイル名の大文字・小文字のルールが間違っている可能性が高い(主に開発環境はWindowsで本番環境がLinuxだと気づきにくい)。

例えば、Model/ItemMst.phpという名前でモデルを作っている場合、Windowsだとファイル名の大文字小文字を無視するのでphpファイルの読み込みが行えるが、LinuxだとModel/itemmst.phpを読みに行こうとしてエラーになってしまう。

newで指定されだクラス名に対して、実際に何のファイル名でクラスローダがロードを試みているか確認したい場合は、Autoloader::load()の最後当たりにある下記の処理にデバッグログを差し込んでみるとわかりやすい。

[fuel\core\classes\autoloader.php]


class Autoloader
{
    public static function load($class)
    {
        ...

        if ( ! $loaded)
        {
            $path = APPPATH.'classes'.DS.static::class_to_path($class);
error_log("load class[{$class}] -> path={$path}\n" , 3, "/path/to/log.txt");
            if (is_file($path))
            {
                static::init_class($class, $path);
                $loaded = true;
            }
        }


FuelPHPでのログ出力はLogクラスを利用して、Log::info(“message”);などで出力できるが、上記の処理はクラスローダ処理なので、Logクラスを使えないことに注意が必要。もし、事情期のログ出力でLogクラスを使用すると、Logクラスの生成でさらにload()メソッドが呼ばれ…、となり想定しないふるまいになってしまう。

[php]phpQueryをcomposer経由でインストールする

PHPからwebページのスクレイピングを行うための有名なライブラリにphpQueryがあります。
phpQueryを使用すると、htmlに対してjQueryのようなセレクタで、取得したいタグの検索などが簡単に行えるので便利です。

今回はこのphpQueryをcomposer経由でインストールしたうえで、簡単な動作確認を行ってみました。

作業手順


phpQueryパッケージをインストールする


まず、composer self-updateコマンドでcomposer自身のアップデートを行ったうえで、requireコマンドを使用してphpqueryパッケージのインストールを行います。

composer self-update
composer require electrolinux/phpquery

composer reuireでインストールができたら、composer infoコマンドで正しくインストールできたか確認します。今回試した時点ではver0.9.6が最新のバージョンでした。

> composer info electrolinux/phpquery
You are running Composer with SSL/TLS protection disabled.
name     : electrolinux/phpquery
descrip. : phpQuery is a server-side, chainable, CSS3 selector driven Document Object Model (DOM) API based on jQuery JavaScript Library
keywords :
versions : * 0.9.6
type     : library
license  : MIT License (MIT) (OSI approved) https://spdx.org/licenses/MIT.html#licenseText
source   : [git] https://github.com/electrolinux/phpquery.git 6cb8afcfe8cd4ce45f2f8c27d561383037c27a3a
dist     : [zip] https://api.github.com/repos/electrolinux/phpquery/zipball/6cb8afcfe8cd4ce45f2f8c27d561383037c27a3a 6cb8afcfe8cd4ce45f2f8c27d561383037c27a3a

names    : electrolinux/phpquery

インストールしたパッケージの動作確認を行う


動作確認のために簡単なプログラムを作ってみます。
なんでもよいのですが、今回はcomposerのパッケージが検索できるサイトから、名前に”helloworld”を含むパッケージの一覧を取得してみます。

一度ブラウザでアクセスしてみるとわかるのですがhttps://packagist.org/search/のページへ、クエリストリング?q=helloworldを付与したURLで検索が結果が表示され、各パッケージのタイトルはh4タグの中に記載されています。

<?php
require 'fuel/vendor/autoload.php';

// composerのパッケージ一覧から、名前に"helloworld"を含むパッケージを取得
$htmlStr = file_get_contents("https://packagist.org/search/?q=helloworld");

// htmlテキストをスクレイピングして、h4タグの一覧を取得
$dom = phpQuery::newDocument($htmlStr);
$titles = pq($dom)->find("h4");

// 取得したすべてのh4タグタイトルを画面に出力
foreach( $titles as $title ) {
    echo trim( pq($title)->text() ) . "\n";
}

上記のプログラムを実行してみた結果が以下の通りです。
想定通り、helloworldな名前を持つパッケージたちが取得できました。

> php test_phpquery.php

reps_demo/helloworld
brooklab/helloworld
abbert/helloworld
dnconcept/hello-world
nsdhami/hello-world
bagwaa/hello-world
vsonx/hello-world
hurad/hello-world
vdrizheruk/hello-world
eric-clinton/helloworld
wyanez/zf2-helloworld
mshige1979/helloworld
joomlatools/com_helloworld
digitalformula/hello-world
donut/hello_world

[FuelPHP] composer updateでfuelphp/upload 2.0.6のアップデートエラーが出るとき

FuelPHPのフレームワーク使用時にcomposer updateを実行した際、下記のエラーがでてパッケージをアップデートできない場合があります。

> composer update

Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - fuelphp/upload 2.0.6 requires ext-fileinfo * -> the requested PHP extension fileinfo is missing from your system.
    - fuelphp/upload 2.0.6 requires ext-fileinfo * -> the requested PHP extension fileinfo is missing from your system.
    - Installation request for fuelphp/upload 2.0.6 -> satisfiable by fuelphp/upload[2.0.6].

  To enable extensions, verify that they are enabled in your .ini files:
    - C:\path\to\php.ini
  You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.

上記のエラーはphp自体の環境でphp_fileinfoのエクステンションが有効になっていない場合に出力されるエラーです。この場合は、エラーメッセージにある通りphp.iniの下記設定を変更することでcomposer updateが可能になります。

;extension=php_fileinfo.dll



extension=php_fileinfo.dll

[php]composer self-updateでエラー[Composer\Downloader\TransportException]が出るとき

composerを使用していてcomposer self-updateコマンド実行時に下記のエラーが出る場合があります

[Composer\Downloader\TransportException]
Your configuration does not allow connections to http://getcomposer.org/versions. 
See https://getcomposer.org/doc/06-config.md#secure-http for details.

このエラーが出る理由ですが、composerはファイルのダウンロードをSSL対応したサイトからのみ許容しているのですが、SSL暗号化がされていないサイトへのアクセスが検出されたためです。本来であればSSL経由でアクセス可能なように対処すべきですが、一時的にこのチェックをOFFにして動作させたい場合もあります。

このような場合、下記のコマンドを実行してsecure-httpの設定値をfalseにすれば、self-updateを実行できます。

composer config --global -- secure-http false

設定された内容は、下記のコマンドでチェック可能です。

composer config --list