2009-09-19 46 views
6

Làm thế nào một tập lệnh PHP có thể bắt đầu một tập lệnh PHP khác, sau đó thoát, để lại tập lệnh khác đang chạy?Tập lệnh PHP có thể bắt đầu một tập lệnh PHP khác và thoát không?

Ngoài ra, có cách nào để tập lệnh thứ 2 thông báo cho tập lệnh PHP khi nó đạt đến một dòng cụ thể không?

+0

Có thể 'trợ giúp với điều này không? Có ý tưởng nào không? –

+0

Curl? Có thể chỉ với một yêu cầu 'đầu', nhưng tôi hoài nghi –

+0

- nếu tập lệnh thứ nhất chấm dứt, thì tập lệnh thứ 2 sẽ thông báo cho 1st như thế nào? - đây có phải là trang web hoặc tập lệnh bảng điều khiển không? –

Trả lời

7

Dưới đây là cách thực hiện. Bạn yêu cầu trình duyệt đọc trong N ký tự đầu tiên của đầu ra và sau đó đóng kết nối, trong khi kịch bản của bạn tiếp tục chạy cho đến khi nó được thực hiệ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

Bạn có thể giải thích mã của mình một chút không? Ví dụ, các thủ thuật xả nước trình duyệt nghĩ rằng yêu cầu HTTP kết thúc? –

+0

Vâng, nó hoạt động! Ngoài ra, hãy đăng câu trả lời này cho câu hỏi này - http://stackoverflow.com/questions/1436575/can-a-php-script-trick-the-browser-into-thinking-the-http-request-is-over –

+0

Tôi đã chỉnh sửa câu trả lời để giải thích một chút. –

1

Đây là ảnh chụp trong bóng tối: bạn có thể thử sử dụng các chức năng thực thi hệ điều hành của php với &.

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

Thêm vào đó, nếu điều đó không làm việc, bạn có thể thử

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

Edit: 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' ?? Cái đó làm cái gì? –

3

Bạn có thể đạt được hiệu quả điều này bằng cách forking và sau đó gọi include hoặc 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); 
?> 

Output:

 
$ 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 

Tuy nhiên, forking không vốn đã cho phép bất kỳ thông tin liên lạc giữa các quá trình, vì vậy bạn 'd phải tìm một số cách khác để thông báo cho phụ huynh rằng đứa trẻ đã đạt đến dòng cụ thể, như bạn đã hỏi trong e câu hỏi.

+0

+1 Tôi không nghĩ đó là chính xác những gì anh ta muốn, nhưng vẫn rất hữu ích –

+0

Bạn có thể cung cấp giao tiếp song phương thông qua các phương pháp socket (xem http://www.php.net/manual/en/ref.sockets.php) . –

0

Nếu bạn không muốn xây dựng phần mở rộng pcntl, thì cách thay thế tốt là sử dụng proc_open().

http://www.php.net/manual/en/function.proc-open.php

Sử dụng rằng cùng với stream_select() để trình PHP của bạn có thể ngủ cho đến khi có chuyện xảy ra với quá trình con bạn đã tạo.

Điều đó có hiệu quả sẽ tạo một quy trình trong nền mà không chặn quá trình PHP gốc. Bạn PHP có thể đọc và ghi vào STDIN, STDOUT, STDERR.

Để làm cho trình duyệt hoàn tất tải (dừng chỉ báo tiến trình tải) thì bạn có thể sử dụng những gì Milan Babuškov đã đề cập.

Chìa khóa để làm cho trình duyệt nghĩ rằng yêu cầu HTTP hoàn tất, là gửi cho nó độ dài nội dung. Để làm điều này, bạn có thể bắt đầu đệm yêu cầu, sau đó xóa nó sau khi bạn gửi tiêu đề Content-Length.

ví dụ:

<?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

Bạn có thể tạo một yêu cầu và đóng kết nối ngay sau khi nó được thực hiện được ghi vào.

Thanh toán mã trong http://drupal.org/project/httprl như có thể thực hiện việc này (yêu cầu không chặn). Tôi có kế hoạch để đẩy lib này để github một khi tôi nhận được nó đánh bóng hơn; cái gì đó có thể chạy bên ngoài drupal. Điều này sẽ làm những gì bạn đang tìm kiếm.

Các vấn đề liên quan