🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

3120閲覧

proc_openを使い非同期で処理したい

chintao1224

総合スコア156

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/03/16 08:13

編集2021/03/17 07:21

pythonのファイルを非同期で実行したいです。
pythonのコードはまだ作成中でサンプル的なものを動かしています。

python(ファイル名はsample.py)

1with open('test.txt', mode='a') as f: 2 for i in range(100): 3 f.write('データ\n')

php

1<?php 2 $descriptorspec = array(); 3 $pipes = null; 4 $cmd = "sample.py" 5 6 $process = proc_open($cmd, $descriptorspec, $pipes); 7 $status = proc_get_status($process); 8 9 do { 10 $state = proc_get_status($process); 11 // waiting 12 usleep(1000 * 3); 13error_log("running\n", 3, "./debug.log"); 14 } while($state['running']); 15 16error_log("end\n", 3, "./debug.log"); 17 proc_close($process); 18?>

visual studio codeでpythonのコードを実行すれば問題なく動いてくれます。
phpで上記コードを実行してもdebug.logには書かれているんですが、sample.pyは動いていないようです。
proc_openはpythonが実行中かどうかを取得したいから使いました。

下記コードも無反応でした。sample.pyが動いていないようです。

php

1exec('sample.py', $output);

phpのコードのどこが悪いか教えてもらえないでしょうか。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

PHP: proc_open - Manual
proc_open()関数の3番めの引数で、実行するサブプロセスの標準入出力ファイルポインターを得るわけなので、
サブプロセス(今回の場合はPythonプログラム)から適切に標準出力すれば、
その状況を$pipe[0]$pipe[1]でインターフェースできるかと。

あと、phpコードから外部のプログラムの実行が許可されているか、
実行環境に依存する話なので、WindowsなのかMacなのか、なにかのLinuxなのかなど、
情報の追加プリーズ。

投稿2021/03/16 08:24

編集2021/03/16 08:26
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chintao1224

2021/03/16 08:39

すみませんでした。windowsです。 おっしゃられていることは、$descriptorspecを下記のように指定してpythonのコードの最後にprint '1'みたいな追記をして変更をするということでしょうか。 $descriptorspec = array( 0 => array("pipe", "r"), // stdin は、子プロセスが読み込むパイプです。 1 => array("pipe", "w"), // stdout は、子プロセスが書き込むパイプです。 2 => array("file", "/tmp/error-output.txt", "a") // はファイルで、そこに書き込みます。 );
chintao1224

2021/03/16 12:06

環境変数を確認したのですが、設定されていました。 C:\Users\<ユーザー名>\AppData\Local\Programs\Python\Python38\Scripts\; C:\Users\<ユーザー名>\AppData\Local\Programs\Python\Python38\; (改修したphpコード) $descriptorspec = array( 0 => array("pipe", "r"), // stdin は、子プロセスが読み込むパイプです。 1 => array("pipe", "w"), // stdout は、子プロセスが書き込むパイプです。 2 => array("file", "/tmp/error-output.txt", "a") // はファイルで、そこに書き込みます。 ); $cmd = "python sample.py" $process = proc_open($cmd, $descriptorspec, $pipes); $status = proc_get_status($process); do { $state = proc_get_status($process); // waiting usleep(1000 * 3); error_log("running\n", 3, "./debug.log"); } while($state['running']); error_log("end\n", 3, "./debug.log"); proc_close($process); やはり何の反応もありません。 環境変数以外に何か設定があるのでしょうか。 phpのコードが良くないのでしょうか。
chintao1224

2021/03/18 01:27

すみません、別の掲示板で質問するため閉じます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問