PHP shell_exec() スクリプトは CPanel ターミナルからは実行されますが、ajax POST 呼び出しからは実行されません。

PHP shell_exec() スクリプトは CPanel ターミナルからは実行されますが、ajax POST 呼び出しからは実行されません。

私の 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 を呼び出すときに、シェルに存在する環境値が不足しています。候補となるのは、PATHPython のマニュアル ページに記載されている変数です。

これを試して:

env -i python3.6 test.py

おそらく、問題の原因を示すエラー メッセージが表示されるはずです。次に、シェル環境に存在する次のような変数を試してください。

env -i PYTHONHOME=$PYTHONHOME python3.6 test.py

必要な環境変数をすべて追加します。これが機能したら、スクリプトの呼び出しにそれらを追加します。スクリプトを呼び出すときは、変数の実際の値を指定する必要があり、それらを として参照することはできません$PYTHONHOME

関連情報