![PHP shell_exec() スクリプトは CPanel ターミナルからは実行されますが、ajax POST 呼び出しからは実行されません。](https://rvso.com/image/1601162/PHP%20shell_exec()%20%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%AF%20CPanel%20%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%8B%E3%82%89%E3%81%AF%E5%AE%9F%E8%A1%8C%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%81%8C%E3%80%81ajax%20POST%20%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%81%8B%E3%82%89%E3%81%AF%E5%AE%9F%E8%A1%8C%E3%81%95%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82.png)
私の Web サイトには、サーバー (CentOS 6 を実行している GoDaddy VPS) 上の PHP ファイルへの POST ajax 呼び出しを持つ JavaScript 関数があり、shell_exec() を介して Python スクリプトを実行し、出力を返します。
Javascript 関数:
function submitdivsheet()
{
$.post("test.php", {}, function(data,status){
console.log(data);
});
}
PHP スクリプト: test.php
<?php
$command = escapeshellcmd('python3.6 test.py');
$output = shell_exec($command);
echo $output;
?>
Python スクリプト: test.py
import sys
print("This is the output")
CPanelのbashターミナルからphpファイルを実行しようとすると、問題は発生しません。 ここに示すようにただし、JavaScript 関数を実行すると、コンソールに空の文字列のみが出力されます。なぜ CPanel ターミナルでのみ実行されるのかはわかりませんが、どこかの権限の問題である可能性があります。この問題を修正するにはどうすればよいですか?
注: shell_exec() が存在しない場合は、サーバーと POST 呼び出しの両方で正常に動作します。shell_exec が問題の原因であると思われます。
編集: PHP スクリプトを次のように変更します。
<?php print shell_exec('echo $PATH'); ?>
これ出力です。
答え1
Web サーバーから Python を呼び出すときに、シェルに存在する環境値が不足しています。候補となるのは、PATH
Python のマニュアル ページに記載されている変数です。
これを試して:
env -i python3.6 test.py
おそらく、問題の原因を示すエラー メッセージが表示されるはずです。次に、シェル環境に存在する次のような変数を試してください。
env -i PYTHONHOME=$PYTHONHOME python3.6 test.py
必要な環境変数をすべて追加します。これが機能したら、スクリプトの呼び出しにそれらを追加します。スクリプトを呼び出すときは、変数の実際の値を指定する必要があり、それらを として参照することはできません$PYTHONHOME
。