どのようにPHPスクリプトが別のPHPスクリプトを起動し、終了して他のスクリプトを実行し続けることができますか?PHPスクリプトで別のPHPスクリプトを起動して終了できますか?
また、2番目のスクリプトが特定の行に達したときにPHPスクリプトに通知する方法はありますか?
どのようにPHPスクリプトが別のPHPスクリプトを起動し、終了して他のスクリプトを実行し続けることができますか?PHPスクリプトで別のPHPスクリプトを起動して終了できますか?
また、2番目のスクリプトが特定の行に達したときにPHPスクリプトに通知する方法はありますか?
ここでその方法を説明します。ブラウザは出力の最初のN文字を読み込んで接続を終了し、スクリプトは完了するまで実行を続けます。
<?php
ob_end_clean();
header("Connection: close");
ignore_user_abort(); // optional
ob_start();
echo ('Text the user will see');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush(); // Will not work
flush(); // Unless both are called !
// At this point, the browser has closed connection to the web server
// Do processing here
include('other_script.php');
echo('Text user will never see');
?>
あなたのコードを少し説明できますか?たとえば、フラッシングによりブラウザはHTTPリクエストが終了したと考えてしまいますか? –
うん、それは動作します!この質問にこの回答を投稿してください - http://stackoverflow.com/questions/1436575/can-a-php-script-trick-the-browser-into-thinking-the-http-request-is-over –
私はそれを少し説明する答えを編集しました。 –
ここは暗闇の中のショットです:&
でPHPのOS実行関数を試してみてください。それが動作しない場合
exec("./somescript.php &");
また、あなたが試すことができます
exec("nohup ./somescript.php &");
'nohup' ??それは何ですか? –
うpcntl_fork()
はあなたが最終的に達成しようとしているものに似た何かをしますか? http://www.php.net/manual/en/function.pcntl-fork.php
forkingで効果的にこれを達成してから、include
またはrequire
を呼び出すことができます。
parent.php:
<?php
$pid = pcntl_fork();
if ($pid == -1) {
die("couldn't fork");
} else if ($pid) { // parent script
echo "Parent waiting at " . date("H:i:s") . "\n";
pcntl_wait($status);
echo "Parent done at " . date("H:i:s") . "\n";
} else {
// child script
echo "Sleeper started at " . date("H:i:s") . "\n";
include('sleeper.php');
echo "Sleeper done at " . date("H:i:s") . "\n";
}
?>
sleeper.php:
<?php
sleep(3);
?>
出力:
$ php parent.php Sleeper started at 01:22:02 Parent waiting at 01:22:02 Sleeper done at 01:22:05 Parent done at 01:22:05
しかし、フォークは、本質的に任意のプロセス間通信を許可するので、あなたはありません子供が特定の行に到達したことを親に知らせるための他の方法を見つける必要があります。 eの質問。
+1私は彼が望んだのとまったく同じだとは思わないが、依然として非常に有用だと思う。 –
ソケットメソッド(http://www.php.net/manual/en/ref.sockets.phpを参照) 。 –
pcntl拡張をビルドしたくない場合は、代わりにproc_open()を使用することをお勧めします。一緒てstream_selectで()ので、あなたのPHPのプロセスが何かまで眠ることができる
http://www.php.net/manual/en/function.proc-open.php
使用して作成した子プロセスで発生します。
これは、親PHPプロセスをブロックすることなく、効果的にバックグラウンドでプロセスを作成します。 PHPはSTDIN、STDOUT、STDERRに読み書きできます。
ブラウザーのロードを完了させるには(ロード進捗インジケーターを停止する)、MilanBabuškovが述べたものを使用できます。
ブラウザを作成するための鍵は、HTTP要求が完了したと思って、コンテンツの長さを送信することです。これを行うには、要求のバッファリングを開始し、Content-Lengthヘッダーを送信した後でその要求をフラッシュします。
例:
<?php
ob_start();
// render the HTML page and/or process stuff
header('Content-Length: '.ob_get_length());
ob_flush();
flush();
// can do more processing
?>
あなたが要求を作成し、書き込まれて実行された直後に、接続を閉じることができます。
http://drupal.org/project/httprlのコードをチェックしてください(ノンブロッキング要求)。私はそれがより磨かれると、私はこのギブスをギブスに押し込むつもりです。 Drupalの外で走れるもの。これはあなたの探していることを行うはずです。
「curl」はこれを助けることができますか?どのようなアイデア? –
カール?おそらくちょうど '頭の'要求で、私は懐疑的です –
- 第1のスクリプトが終了したら、第2のスクリプトはどのように第1のものを通知しますか? - これはウェブページかコンソールスクリプトですか? –