پردازش موازی در PHP

بدون شرح میریم سر اصل قضیه!

میخوایم j1.php و j2.php رو بصورت موازی اجرا کنیم.
محتویات این دو فایل مشابه اینه:
$jobname = 'j1';
set_time_limit(0);
$secs = 60;

while ($secs) {
echo $jobname,'::',$secs,"\n";
flush(); @ob_flush(); ## make sure that all output is sent in real-time
$secs -= 1;
$t = time();
sleep(1); // pause
}

نکته: بنظرم یه اشتباه کوچک در این نمونه کد هست و اون اینکه ob_flush باید قبل از flush باشه.
اینم فایل کنترل اصلی:
#
# control.php
#
function JobStartAsync($server, $url, $port=80,$conn_timeout=30, $rw_timeout=86400)
{
$errno = '';
$errstr = '';

set_time_limit(0);

$fp = fsockopen($server, $port, $errno, $errstr, $conn_timeout);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
return false;
}
$out = "GET $url HTTP/1.1\r\n";
$out .= "Host: $server\r\n";
$out .= "Connection: Close\r\n\r\n";

stream_set_blocking($fp, false);
stream_set_timeout($fp, $rw_timeout);
fwrite($fp, $out);

return $fp;
}

// returns false if HTTP disconnect (EOF), or a string (could be empty string) if still connected
function JobPollAsync(&$fp)
{
if ($fp === false) return false;

if (feof($fp)) {
fclose($fp);
$fp = false;
return false;
}

return fread($fp, 10000);
}

###########################################################################################

if (1) { /* SAMPLE USAGE BELOW */

$fp1 = JobStartAsync('localhost','/jobs/j1.php');
$fp2 = JobStartAsync('localhost','/jobs/j2.php');

while (true) {
sleep(1);

$r1 = JobPollAsync($fp1);
$r2 = JobPollAsync($fp2);

if ($r1 === false && $r2 === false) break;

echo "<b>r1 = </b>$r1<br>";
echo "<b>r2 = </b>$r2<hr>";
flush(); @ob_flush();
}

echo "<h3>Jobs Complete</h3>";
}

و اینم نمونهء خروجی اجرای این برنامه:
r1 = HTTP/1.1 200 OK
Date: Wed, 03 Sep 2008 07:20:20 GMT
Server: Apache/2.2.4 (Unix) mod_ssl/2.2.4 OpenSSL/0.9.8d
X-Powered-By: Zend Core/2.5.0 PHP/5.2.5
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html

7 j1::60

r2 = HTTP/1.1 200 OK
Date: Wed, 03 Sep 2008 07:20:20 GMT
Server: Apache/2.2.4 (Unix) mod_ssl/2.2.4 OpenSSL/0.9.8d
X-Powered-By: Zend Core/2.5.0 PHP/5.2.5
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html

7 j2::60
----
r1 = 7 j1::59

r2 = 7 j2::59
----
r1 = 7 j1::58

r2 = 7 j2::58

----

منبع: http://phplens.com/phpeverywhere/?q=node/view/254

چرا توضیح بیشتری ندادم؟ کد رو بررسی کنید باید متوجه طرز کارش بشید. اگر نشدید، یعنی هنوز توی برنامه نویسی پخی نیستید! جدی میگم! بنظر من این نمونهء خوبیه برای ارزیابی پایه و توانایی بالقوه افراد در برنامه نویسی. البته خروجی ای هم که داده از یک جهت خودش عجیب تر و سخت تره که اگر اینو هم بفهمید یعنی توی برنامه نویسی واقعا سواد و استعداد خوبی دارید! البته اگر انگلیسیتون خوب باشه میتونید از متن اصلی هم برای فهمیدن این قضایا استفاده کنید که بازم بهرحال توانایی استفاده بدون مشکل از منابع اصلی خودش یک توانایی پیشرفته بحساب میاد. البته دروغ نگم این مطلب زیاد جنبهء آموزشی نداشت که توضیح ندادم، چون یک موضوع نسبتا پیشرفته هست بهرحال و هرکس که دنبال چنین چیزهایی هست باید فرض رو بر این گذاشت که سوادش هم بقدر حداقلی هست بالاخره، از طرف دیگر یک هدفم هم آرشیو کردن این مطلب برای رجوع احتمالی خودم در آینده بهش بود، چون این یکی از ساده ترین و هوشمندانه ترین و قشنگ ترین/تمیزترین کدهایی در این زمینه هست که تاحالا دیدم و بهتره برای استفاده های احتمالی آینده دم دست بذارمش! حیفه یوقت منبع اصلی بلایی سرش بیاد و جای دیگه نشه براحتی پیداش کرد.

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*

شما می‌توانید از این دستورات HTML استفاده کنید: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>