はじめに
今日、他の人に protobuf の使い方を教えていたときに、php cli モードで奇妙な問題を発見しました。解決策を見つけるのに長い時間がかかりました。ここで共有します。
問題の説明
ここで最初に protobuf プロトコルを導入し、allegro/php-protobuf 拡張機能を使用してインストールしました。他の同僚もここ数日でこれを使用する予定なので、protobuf が PHP クラス ライブラリ ファイルを生成する部分を、これらのコンテンツが含まれる公開場所 /data/php_proto/ フォルダーに置きました。
drwsrwxr-x 2 yanruitao ユーザー 4096 10 月 14 日 17:05 Dmp
-rwxrwxr-x 1 yanruitao ユーザー 472 10 月 10 日 17:59 dmp.proto
drwsrwxr-x 2 yanruitao ユーザー 4096 10 月 10 日 17:54 ProtobufCompiler
-rwxrwxr-x 1 yanruitao ユーザー 2969 2015 年 3 月 9 日 protoc-php.php
php protoc-php.php -n --psr dmp.proto //-n は名前空間を使用し、--psr は psr-4 標準を使用し、使用時に他のエラーが報告されます。
PHP 警告: file_put_contents(pb_proto_dmp.php): ストリームを開けませんでした: /data/php_proto/ProtobufCompiler/ProtobufParser.php の 309 行目で許可が拒否されました
$yanruitao: php -i grep 'php.ini'
$yanruitao: sudo php -i grep 'php.ini'
2 人のユーザーは同じ構成ファイルをロードしません。通常のユーザーはファイル /usr/local/php/lib/php.ini をロードしますが、root ユーザーはファイル /etc/php.ini をロードします。この 2 つのファイルの内容は矛盾しています。ははは、すぐに /etc/php.ini をバックアップし、/usr/local/php/lib/php.ini を /etc/php.ini にコピーしました。コピーして使ってみたら、たくさんのエラーが報告されてショックを受けました:
PHP 警告: PHP スタートアップ: ダイナミック ライブラリ '/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/web_stub_cntl.so' - /usr/local/php/lib/ をロードできませんphp/extensions/no-debug-non-zts-20100525/web_stub_cntl.so: 未定義のシンボル: 0 行目の不明の zend_new_interned_string
警告: PHP スタートアップ: ダイナミック ライブラリ '/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/web_stub_cntl.so' - /usr/local/php/lib/php をロードできません/extensions/no-debug-non-zts-20100525/web_stub_cntl.so: 未定義のシンボル: zend_new_interned_string 行 0 の不明
PHP 警告: PHP スタートアップ: テスト: モジュールを初期化できません
モジュール API=20100525 でコンパイルされたモジュール
モジュール API=20090626 でコンパイルされた PHP
これらのオプションは一致する必要があります
ライン0の不明です
警告: PHP スタートアップ: テスト: モジュールを初期化できません
モジュール API=20090626 でコンパイルされた PHP
これらのオプションは一致する必要があります
ライン0の不明です
PHP 警告: PHP 起動: ダイナミック ライブラリ '/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/protobuf.so' - /usr/local/php/lib/php をロードできません/extensions/no-debug-non-zts-20100525/protobuf.so: 未定義のシンボル: zend_new_interned_string (行 0 に不明)
警告: PHP スタートアップ: ダイナミック ライブラリ '/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/protobuf.so' - /usr/local/php/lib/php をロードできません/extensions/no-debug-non-zts-20100525/protobuf.so: 未定義のシンボル: zend_new_interned_string (行 0 に不明)
警告: PHP スタートアップ: ダイナミック ライブラリ '/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/imagick.so' - /usr/local/php/lib/php をロードできません/extensions/no-debug-non-zts-20100525/imagick.so: 未定義のシンボル: zend_new_interned_string (行 0 に不明)
警告: PHP スタートアップ: ダイナミック ライブラリ '/data/boss/phpredis-develop/modules/redis.so' をロードできません - /data/boss/phpredis-develop/modules/redis.so: 未定義のシンボル: zend_new_interned_string が不明です0行目
警告: PHP スタートアップ: ダイナミック ライブラリ '/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/curl.so' - /usr/local/php/lib/php をロードできません/extensions/no-debug-non-zts-20100525/curl.so: 共有オブジェクト ファイルを開けません: 0 行目の不明にそのようなファイルまたはディレクトリはありません
PHP 警告: PHP 起動: ダイナミック ライブラリ「/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/fileinfo.so」をロードできません - /usr/local/php/lib/php /extensions/no-debug-non-zts-20100525/fileinfo.so: 共有オブジェクト ファイルを開けません: 0 行目の不明にそのようなファイルまたはディレクトリはありません
警告: PHP スタートアップ: ダイナミック ライブラリ '/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/fileinfo.so' - /usr/local/php/lib/php をロードできません/extensions/no-debug-non-zts-20100525/fileinfo.so: 共有オブジェクト ファイルを開けません: 0 行目の不明にそのようなファイルまたはディレクトリはありません
PHP 警告: PHP 起動: ダイナミック ライブラリ「/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/gd.so」をロードできません - /usr/local/php/lib/php /extensions/no-debug-non-zts-20100525/gd.so: 共有オブジェクト ファイルを開けません: 0 行目の不明にそのようなファイルまたはディレクトリはありません
警告: PHP スタートアップ: ダイナミック ライブラリ '/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/gd.so' - /usr/local/php/lib/php をロードできません/extensions/no-debug-non-zts-20100525/gd.so: 共有オブジェクト ファイルを開けません: 0 行目の不明にそのようなファイルまたはディレクトリはありません
PHP 警告: PHP 起動: 動的ライブラリ「/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/json.so」をロードできません - /usr/local/php/lib/php /extensions/no-debug-non-zts-20100525/json.so: 共有オブジェクト ファイルを開けません: 0 行目の不明にそのようなファイルまたはディレクトリはありません
警告: PHP スタートアップ: ダイナミック ライブラリ '/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/json.so' - /usr/local/php/lib/php をロードできません/extensions/no-debug-non-zts-20100525/json.so: 共有オブジェクト ファイルを開けません: 0 行目の不明にそのようなファイルまたはディレクトリはありません
PHP 警告: PHP 起動: 動的ライブラリ「/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/phar.so」をロードできません - /usr/local/php/lib/php /extensions/no-debug-non-zts-20100525/phar.so: 共有オブジェクト ファイルを開けません: 0 行目の不明にそのようなファイルまたはディレクトリはありません
警告: PHP スタートアップ: ダイナミック ライブラリ '/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/phar.so' - /usr/local/php/lib/php をロードできません/extensions/no-debug-non-zts-20100525/phar.so: 共有オブジェクト ファイルを開けません: 0 行目の不明にそのようなファイルまたはディレクトリはありません
PHP 警告: PHP 起動: ダイナミック ライブラリ「/data/boss/phpredis-develop/modules/redis.so」をロードできません - /data/boss/phpredis-develop/modules/redis.so: 未定義のシンボル: zend_new_interned_string が不明です0行目
警告: PHP スタートアップ: ダイナミック ライブラリ '/data/boss/phpredis-develop/modules/redis.so' をロードできません - /data/boss/phpredis-develop/modules/redis.so: 未定義のシンボル: zend_new_interned_string が不明です0行目
PHP 警告: PHP 起動: ダイナミック ライブラリ「/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/zip.so」をロードできません - /usr/local/php/lib/php /extensions/no-debug-non-zts-20100525/zip.so: 共有オブジェクト ファイルを開けません: 0 行目の不明にそのようなファイルまたはディレクトリはありません
警告: PHP スタートアップ: ダイナミック ライブラリ '/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/zip.so' - /usr/local/php/lib/php をロードできません/extensions/no-debug-non-zts-20100525/zip.so: 共有オブジェクト ファイルを開けません: 0 行目の不明にそのようなファイルまたはディレクトリはありません
protoc-php.php を実行するには protobuf 拡張機能がインストールされている必要があります
これは私は着ていません。
時間は過ぎ去りました、何の解決策も公開されませんでした、あるアプリケーションの解決策を破棄しました、修正/data/php_proto/文件の制限は0775で、他の通常のユーザーは直接使用できます、加sudoは使用しません(これは我的错,忘记修正文件夹权限了,这也让我发现了这个诡异的问题)
chmod -R 0775 /data/php_proto
これらの危険な発言を考慮すると、大部分は拡張の問題であり、拡張のインストールが失敗したり、拡張が存在しないこともあり、通常のユーザーには許可されますが、root ユーザーには実行できません。
//非ルート
追加の .ini ファイルが解析されました => (なし)
このディレクトリをスキャンして追加の .ini ファイルを探します => /etc/php.d
追加の .ini ファイルが解析されました => /etc/php.d/curl.ini,
……
命名追加されたものは一样の構成文件怎么追加後の内容は不一样呢?
半日を経て、傷ついた場所の一部がこれに関係していることがわかったが、これも古い修復に到達していない。
root 用と非 root 用の php 実行可能ファイルは一致していません
root => /usr/bin/php
非 root => /usr/local/bin/php
これら 2 つのファイルで php -v を使用してみましたが、root ユーザーのバージョンが 5.3.3 で、root ユーザー以外のバージョンが 5.4.6 でした。ははは、誰が環境をデプロイしたのか混乱しました。人を騙すこと。
元の /usr/bin/php をバックアップし、/usr/local/bin/php をコピーして上書きしてみます。php -v を使用した後、バージョンは同じであり、php protoc を実行してもエラーは報告されません。 -php を再度実行すると、すべてが正常であることがわかり、問題は解決されました。
長い間苦労した結果、バージョンの問題であることが判明しました。