PHP が Python の呼び出しに失敗した場合はどうすればよいですか?
PHP による Python 呼び出しの失敗の解決策
次のファイルがあると仮定します: php_test.php python_test.py
Python を実行します。 php ファイル:
exec("python python_test.py", $array, $ret);
Python の実行中にエラーが発生した場合、配列に保存できないため、標準エラーをファイルにリダイレクトする必要があります。上記のコードは次のように書き換えられます:
exec("python python_test.py 2>error.txt", $array, $ret);
bash 0,1 では、3 つの数字 2 は STDIN_FILENO、STDOUT_FILENO、および STDERR_FILENO を表します。これらは標準入力 (通常はキーボード)、標準出力 (通常はディスプレイ画面、または正確にはユーザー端末コンソール) です。と標準エラー(エラー情報出力)です。
次の方法で、標準エラーを標準出力にリダイレクトし、それを $array に保存することもできます。
exec("python python_test.py 2>error.txt 2>&1", $array, $ret);
その後、エラー メッセージに基づいて解決策を見つけることができます。
通常、ターミナル上のコマンドでPHPファイルを実行するとすぐにエラーメッセージが表示されますが、ブラウザでPHPファイルを実行した場合は上記の方法でしかエラーメッセージを出力できません。 。したがって、問題は、PHP はコマンド ラインでは Python ファイルを正常に実行できますが、ブラウザからは正常に実行できないということです。これは、2 つのメソッドによって呼び出される動的ライブラリが矛盾しているためです。
システム内の既存の動的ライブラリはコマンド ラインを通じて呼び出され、Web サーバー内の動的ライブラリはブラウザを通じて呼び出されます。 (XAMPP をインストールしたので、lampp/lib の動的ライブラリがブラウザ経由で呼び出されます)。
解決策:
1. 出力エラー メッセージで間違ったダイナミック ライブラリを見つけます。
2. ロケート コマンド Location を使用して、関連するダイナミック ライブラリを見つけます。 :locate libxxx.so
3. Web サーバー内の同じ名前のダイナミック ライブラリを削除または名前変更します。
4. 手順 2 でシステム内で見つかったダイナミック ライブラリを
にリンクします。Web サーバーの lib ディレクトリの例:
Python で hashlib モジュールを使用すると、2 つのエラーが発生する可能性があります:
<span style="font-family:Arial, Helvetica, sans-serif;">relocation error: python: symbol OpenSSL_add_all_digests, version OPENSSL_1.0.0 not defined in file libcrypto.so.1.0.0 with link time reference</span> <span style="font-family:Arial, Helvetica, sans-serif;">python: /opt/lampp/lib/libcrypto.so.1.0.0: version `OPENSSL_1.0.2' not found (required by /opt/lampp/lib/libssl.so.1.0.0)</span>
1. システムに libcrypto.so が含まれていることを確認します。 1.0.0 へのすべてのパス: libcryto.so.1.1
/home/ubuntu/.cache/vmware/drag_and_drop/52091a33-81b7-cc30-d88c-574c47558e32/ndk/libimobiledevice-android-master/openssl/libcrypto.so.1.0.0 /home/ubuntu/.cache/vmware/drag_and_drop/52091a33-81b7-cc30-d88c-574c47558e32/ndk/libimobiledevice-android-master/out/fsroot/lib/libcrypto.so.1.0.0 /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 /opt/lampp/lib/libcrypto.so.1.0.0
2 を見つけます。Web サーバーで同じ名前のダイナミック ライブラリの名前を変更します:
sudo mv /opt/lampp/lib/libcryto.so.1.1 /opt/lampp/lib/libcryto.so.1.1.bak
3。libcryto.so.1.1 を変更します。システム内 Web サーバーの lib ディレクトリへのリンク:
sudo ln -s /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 /opt/lampp/lib/libcryto.so.1.1
libssl.so.1.0.0 解決手順は上記と同じです。
PHP 関連の知識について詳しくは、PHP チュートリアル をご覧ください。
以上がPHPがPythonの呼び出しに失敗した場合の対処方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。