2012-01-26 35 views
17

tôi có mã đó là một chút như thế này:Gọi một hàm trong một sợi nền/quá trình (forking)

($i=0; $i < 100; $i++) 
{ 
    do ($foo[$i]); 
} 

Trên đây là một nhiệm vụ chuyên sâu thời gian, và tôi đã hy vọng để có thể tạo ra một chức năng, và gọi nó là hai lần như dưới đây

function wrapper($start;$end) 
{ 
    ($i=$start; $i < $end; $i++) 
    { 
     do ($foo[$i]); 
    } 
} 
//have both of these run in parallel 
wrapper(0,50); 
wrapper(51,100); 

tôi nhìn gearman nhưng tôi không thể sử dụng nó như tôi không thể cài đặt máy chủ gearman (kể từ khi tôi đang trên một máy chủ chia sẻ). Nó có vẻ như cách để đạt được điều này sẽ là do forking. Tôi đã cố gắng đọc rất nhiều về nó, nhưng tài liệu và hỗ trợ là rất ít. Mọi mã trợ giúp/wireframe sẽ được đánh giá cao.

Để xác định câu hỏi của tôi, làm cách nào tôi có thể gọi số wrapper() chuyển qua các đối số sao cho nó thực thi trong quá trình con. Ngoài ra, điều quan trọng là tôi có thể đăng ký chức năng gọi lại.

Chi tiết bổ sung: PHP 5.3, chạy trên máy chủ Linux. Tập lệnh được thực thi bởi cgi-fcgi.

Tôi nghĩ rằng đây là cách tôi phải tạo ra một tiến trình con, nhưng làm thế nào tôi có thể sử dụng nó để sinh ra nhiều tiến trình con? Và làm cách nào để đăng ký chức năng gọi lại?

$pid = pcntl_fork(); 

if ($pid == -1) {   
    // Fork failed    
    exit(1); 
} else if ($pid) { 
    // The parent process 
    //should I repeat this same code here to spawn another child process? 

} else { 
    // the child process 
    //can I call wrapper from here and will it run in this child process? 

Trả lời

9

Từ "blog chuyên nghiệp Tudor Barbu của"
(http://blog.motane.lu/2009/01/02/multithreading-in-php/)

require_once('Thread.php'); 

// test to see if threading is available 
if(! Thread::isAvailable()) { 
    die('Threads not supported'); 
} 

// function to be ran on separate threads 
function paralel($_limit, $_name) { 
    for ($index = 0; $index < $_limit; $index++) { 
     echo 'Now running thread ' . $_name . PHP_EOL; 
     sleep(1); 
    } 
} 

// create 2 thread objects 
$t1 = new Thread('paralel'); 
$t2 = new Thread('paralel'); 

// start them 
$t1->start(10, 't1'); 
$t2->start(10, 't2'); 

// keep the program running until the threads finish 
while($t1->isAlive() && $t2->isAlive()) { 

} 

Download Thread.php

+0

Cảm ơn. Điều này có vẻ giống như một wrapper rực rỡ. Tôi đang xem xét mã ngay bây giờ – xbonez

+1

Liên kết mà bạn tham chiếu cũng cho biết thật tệ khi sử dụng vòng lặp trống để kiểm tra xem chuỗi có còn hoạt động hay không, vì nó sẽ sử dụng hết tất cả CPU của bạn. Bạn nên bao gồm một giấc ngủ trong vòng lặp. – Kelvin

+0

@Kelvin, một giải pháp tốt hơn là triển khai khả năng 'join' vào thư viện, nên khá đơn giản để thực hiện. –

2

Nếu bạn đang sử dụng Linux, bạn có thể tận dụng các dòng lệnh và làm

public function newWrapperInstance($start,$end){ 
    exec('bash -c "exec nohup setsid php-cli yourFile.php '.$start.' '.$end.' > /dev/null 2>&1 &"'); 
} 

Điều này sẽ tạo ra một thể hiện mới của PHP trong nền và tách bản thân khỏi hàm exec trong chuỗi chính.

Cảnh báo: Nhược điểm duy nhất là bạn không thể kiểm soát những gì các chủ đề đó thực hiện khi chúng được tạo.

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