2009-09-19 34 views
6

どのようにPHPスクリプトが別のPHPスクリプトを起動し、終了して他のスクリプトを実行し続けることができますか?PHPスクリプトで別のPHPスクリプトを起動して終了できますか?

また、2番目のスクリプトが特定の行に達したときにPHPスクリプトに通知する方法はありますか?

+0

「curl」はこれを助けることができますか?どのようなアイデア? –

+0

カール?おそらくちょうど '頭の'要求で、私は懐疑的です –

+0

- 第1のスクリプトが終了したら、第2のスクリプトはどのように第1のものを通知しますか? - これはウェブページかコンソールスクリプトですか? –

答えて

7

ここでその方法を説明します。ブラウザは出力の最初の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'); 
?> 
+1

あなたのコードを少し説明できますか?たとえば、フラッシングによりブラウザはHTTPリクエストが終了したと考えてしまいますか? –

+0

うん、それは動作します!この質問にこの回答を投稿してください - http://stackoverflow.com/questions/1436575/can-a-php-script-trick-the-browser-into-thinking-the-http-request-is-over –

+0

私はそれを少し説明する答えを編集しました。 –

1

ここは暗闇の中のショットです:&でPHPのOS実行関数を試してみてください。それが動作しない場合

exec("./somescript.php &"); 

また、あなたが試すことができます

exec("nohup ./somescript.php &"); 

編集:nohup is a POSIX command to ignore the HUP (hangup) signal, enabling the command to keep running after the user who issues the command has logged out. The HUP (hangup) signal is by convention the way a terminal warns depending processes of logout.

+0

'nohup' ??それは何ですか? –

3

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の質問。

+0

+1私は彼が望んだのとまったく同じだとは思わないが、依然として非常に有用だと思う。 –

+0

ソケットメソッド(http://www.php.net/manual/en/ref.sockets.phpを参照) 。 –

0

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 

?> 
0

あなたが要求を作成し、書き込まれて実行された直後に、接続を閉じることができます。

http://drupal.org/project/httprlのコードをチェックしてください(ノンブロッキング要求)。私はそれがより磨かれると、私はこのギブスをギブスに押し込むつもりです。 Drupalの外で走れるもの。これはあなたの探していることを行うはずです。

関連する問題