2016-08-17 14 views
0

proc_open()でコマンドを実行するための新しいサーバーで問題が発生しています。テストのために次のスクリプトを作成しました。同じコマンドを複数回実行するproc_open()はなぜですか?

$desc = array(
    0 => array('pipe', 'r'), // we use to write data 
    1 => array('pipe', 'w'), // we use to read data 
    2 => array('pipe', 'w') // errors' log 
); 

$cmd = "exec php -v"; 
$process = proc_open($cmd, $desc, $pipes); 

if (is_resource($process)) { 
    stream_set_blocking($pipes[1], 0); 
    stream_set_blocking($pipes[2], 0); 
    $cmd .= "\nMETA: " . print_r(stream_get_meta_data($pipes[1]), true); 

    if (is_resource($pipes[1])) { 
     $cmd .= "\nSTDOUT: " . stream_get_contents($pipes[1]); 
    } 

    if (is_resource($pipes[2])) { 
     $cmd .= "\nSTDERR: " . stream_get_contents($pipes[2]); 
    } 

    $status = proc_get_status($process); 
    $cmd .= "\n" . print_r($status, true); 
    proc_close($process); 
} else { 
    $cmd .= "\nFailed!"; 
} 

echo "<pre>{$cmd}</pre>"; 

スクリプトは単にハングし、出力を表示しません。コンソールを調べると、同じコマンドが複数回生成されていることがわかります。参照:

root[~]# clear && ps ax o pid,args | grep [p]hp 
10122 /usr/bin/php /home/user/public_html/thread.php 
10124 php -v 
10126 php -v 
10128 php -v 
10130 php -v 
10132 php -v 
10134 php -v 
10136 php -v 
10138 php -v 
10140 php -v 
10142 php -v 
10144 php -v 
10146 php -v 
10148 php -v 
10150 php -v 
10152 php -v 
10154 php -v 
10156 php -v 
10158 php -v 
10160 php -v 
10162 php -v 
10164 php -v 
10166 php -v 
10168 php -v 
10170 php -v 
10172 php -v 
10174 php -v 
10176 php -v 
10178 php -v 
10181 php -v 
10184 php -v 
10187 php -v 
10189 php -v 
10191 php -v 
10193 php -v 
10195 php -v 
10197 php -v 
10199 php -v 
10201 php -v 
10205 php -v 
10207 php -v 
10210 php -v 
10212 php -v 
10214 php -v 
10216 php -v 
10219 php -v 
10222 php -v 
10224 php -v 
10226 php -v 
10229 php -v 
10231 php -v 
10233 php -v 
10235 php -v 
10237 php -v 
10239 php -v 
10242 php -v 
10245 php -v 
10248 php -v 
10250 php -v 
10252 php -v 
10254 php -v 
10256 php -v 
10258 php -v 
10260 php -v 
10262 php -v 
10264 php -v 
10266 php -v 
10268 php -v 
10270 php -v 
10272 php -v 
10274 php -v 
10276 php -v 
10279 php -v 
10282 php -v 
10284 php -v 
10287 php -v 
10289 php -v 
10291 php -v 
10293 php -v 
10295 php -v 
10297 php -v 
10299 php -v 
10301 php -v 
10303 php -v 
10305 php -v 
10307 php -v 
10309 php -v 
10311 php -v 
10313 php -v 
10315 php -v 
10317 php -v 
10319 php -v 
10321 php -v 
10323 php -v 
10325 php -v 
10327 php -v 
10329 php -v 

ただし、同じスクリプトはローカルマシン(Win10)で動作します。私はすでにこの問題について探検しましたが、それ以外のところは見つけられませんでした。

サーバ環境やPHPのインストールに関連するものはありますか?

+0

あなたは何を達成しようとしていますか?なぜあなたは 'exec'を呼びますか? – miken32

+0

実際には、私は外部プロセスでPHPスクリプトを実行したいと思います。その理由は、 'Thread'というクラスを持つフレームワークを書いたからです。このクラスは、(非同期に)別のプロセスでアクションを実行するためのものです。だから私は新しいシェルを起動し、バックグラウンドでPHPスクリプトを実行することです。このソリューションはすでに他のプラットフォームでうまく動作していますが、今ではこの問題に直面しました。 –

+0

そして 'exec'について、スニペットはそれなしでうまく動作します。しかし、私の実際の実装では、それを置く必要がありました(コードが少し古くなった理由を覚えていない)。しかし、私が間違っていないなら、実際のコマンドのサブシェルを取得しないことです。 –

答えて

0

なぜか分かりませんが、PHPハンドラをsuphpからcgiに変更すると、この問題は解決しました。スクリプトは期待どおりに動作します。

誰かが理由を説明できる場合は、歓迎します。

関連する問題