2010-08-20 32 views
6

Tôi đang cố gắng sinh ra nhiều quy trình cùng một lúc trong PHP với proc_open, nhưng cuộc gọi thứ hai sẽ không bắt đầu cho đến khi quá trình đầu tiên kết thúc. Dưới đây là đoạn code tôi đang sử dụng:Làm thế nào tôi có thể sinh ra các tiến trình đồng thời với PHP?

for ($i = 0; $i < 2; $i++) 
{ 
    $cmdline = "sleep 5"; 
    print $cmdline . "\n"; 
    $descriptors = array(0 => array('file', '/dev/null', 'r'), 
         1 => array('file', '/dev/null', 'w'), 
         2 => array('file', '/dev/null', 'w')); 
    $proc = proc_open($cmdline, $descriptors, $pipes); 
    print "opened\n"; 
} 

Trả lời

6

Những người khác đang chỉ ra các giải pháp thay thế, nhưng vấn đề thực tế của bạn có thể là sự rò rỉ biến $ proc của bạn. Tôi tin rằng PHP có để theo dõi này và nếu bạn đang ghi đè lên nó, nó sẽ dọn sạch cho bạn (có nghĩa là proc_close, có nghĩa là chờ đợi ...)

Cố gắng không bị rò rỉ các $ proc giá trị:

<?php 
$procs = array(); 
for ($i = 0; $i < 2; $i++) 
{ 
    $cmdline = "sleep 5"; 
    print $cmdline . "\n"; 
    $descriptors = array(0 => array('file', '/dev/null', 'r'), 
    1 => array('file', '/dev/null', 'w'), 
    2 => array('file', '/dev/null', 'w')); 
    $procs[]= proc_open($cmdline, $descriptors, $pipes); 
    print "opened\n"; 
} 
?> 

Lưu ý: Điều này sẽ vẫn làm sạch các trình xử lý của bạn trước khi thoát, vì vậy tất cả các quy trình sẽ phải hoàn thành trước. Bạn nên sử dụng proc_close sau khi bạn đã làm xong bất cứ điều gì bạn cần làm với chúng (ví dụ: đọc ống, v.v.). Nếu những gì bạn thực sự muốn là để khởi động chúng và quên chúng đi, đó là một giải pháp khác.

+0

Sửa lỗi. Nó sẽ được tốt đẹp nếu điều này đã được tài liệu. –

+0

WTF ?! Tại sao điều này không cho chúng tôi biết trong hướng dẫn sử dụng PHP? Tôi đã điều tra về vấn đề này trong nhiều giờ và sau đó nó đi ra rằng proc_open (những gì được đề xuất một cách rõ ràng cho nhiều "kiểm soát tiên tiến" hơn procs tùy chỉnh) là vô ích. – kishkash

0
+0

Chức năng nào đặc biệt? pcntl_exec trông giống như cái duy nhất tạo ra một cái gì đó, và nó dừng quá trình hiện tại. –

+0

pcntl_fork() (không hoạt động trên win32 php) –

0

Hãy thử điều này:

$cmdline = "sleep 5 &"; 
0

Tôi nghĩ rằng đó là cách "proc_open" được thiết kế để hoạt động (thực sự là hệ thống). Bạn cần phải xác định bạn muốn ngắt kết nối với & hoặc bằng cách thực sự chạy tập lệnh trình bao sẽ chạy chương trình con và trả lại cho bạn.

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