الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

طريقة عرض البيانات باستخدام real time php

بدأه feras jamal في 16 يوليو 2012 · 5 رد · 763 مشاهدة · في منتدى تطوير المواقع بـ PHP
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله،،

عندي موضوع يحتاج الى خبرة في مجال ال php وارجو ان نحصل على دعم جميع الخبراء من الاعضاء والمشرفين،

الموضوع يا جماعة الخير، اني اريد ان اقوم بتنفيذ ملف .bat عن طريق لغة ال php حيث ان الغاية من استخدام ال php هو عرض المخرجات التي يقوم بها ملف bat للمستخدم لجعله دائما يعلم ما الذي يحصل في ال background

ملف البات هو ملف بسيط يحتوي على ping 127.0.0.1 او مثلا تنفيذ اوامر معينة عن طريق cmd.exe

اولا: قمت بانشاء ملف تكست وقمت بالكتابة بداخله ping 127.0.0.1 ثم قمت بحفظ الملف باسم ping.bat

ثانيا: قمت بكتابة php script كالتالي:

		$start=microtime(true);
		system('ping.bat > log.txt');// تحويل المخرجات لملف تكست
		Read_log('log.txt');//طباعة اخر 3 مخرجات فقط للمستخدم عن طريق الدالة المكتوبة في الاسفل




function Read_log($file)
{
	$readin=array();
	$readin=file($file);
	$count=0;
	$readin_count=count($readin);

	for($count=$readin_count-3;$count<$readin_count;$count++)
	{	
		//if(isset($readin[$count]))
		echo $readin[$count]."<br/>";
	}


}

من المعلوم لدينا ان الدالة system او exec او passthru جميعها تعمل بالية انه عند اتمام وتنفيذ الاوامر تقوم بارجاع ال output وذلك فقط عند انتهاء العملية،

الذي اريد عمله هو انه عند تنفيذ ping 127.0.0.1 ان اعرض العمليات التي تتم للمستخدم بحيث تظهر له النتائج line-by line يعني:

Pinging 127.0.0.1 with 32 bytes of data:

Reply from 127.0.0.1: bytes=32 time<1ms TTL=128

Reply from 127.0.0.1: bytes=32 time<1ms TTL=128

Reply from 127.0.0.1: bytes=32 time<1ms TTL=128

Reply from 127.0.0.1: bytes=32 time<1ms TTL=128

Ping statistics for 127.0.0.1:

Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),

Approximate round trip times in milli-seconds:

Minimum = 0ms, Maximum = 0ms, Average = 0ms

ولكن سطر بعض سطر وكاننا ننظر الى command prompt

اتمنى ان اجد الحل لديكم

بالتوفيق

If your actions inspire others to dream more, learn more, do more and become more, you are a leader

Best Regards

Feras Abualrub

#2

في واحد حاط نفس سؤالك هنا

http://stackoverflow.com/questions/1281140/run-process-with-realtime-output-in-php

جرب اطلع على الرابط وتابع الردود يمكن تفيدك

كذلك اعتقد ان موضوعك ماله علاقة بالـ thread , لان ال thread يعني تنفيذ عمليتين بنفس الوقت واللحظة كأنهم Process واحدة

تم تعديل هذه المشاركة بواسطة M.B.O في 17 يوليو 2012 في 00:05

M.B.O

Mohamed Bin Othman

إبن المكلا

يابني البشر ماذا فعلتم بالبشر !!

إسـألـنـي

#3

جربته سابقا وللاسف لم ينجح ، وجربت مرة ثانية وغيرت الcommand لانه بيئة العمل عندي ويندوز ولكن لم ينجح نهائيا

If your actions inspire others to dream more, learn more, do more and become more, you are a leader

Best Regards

Feras Abualrub

#4

انتهيت ولكن يوجد حلول اسرع واسلسل عن طريق الدالة popen ، جاري البحث والعمل عليها،،،، في حالة اهتمام احد الاعضاء بالموضوع، يرجى الرد لاقوم بطرح الحل الامثل حال التوصل اليه

set_time_limit(0);
ob_implicit_flush(0);
//$cmd = "dir";
$cwd='./';

$descriptorspec = array(
   0 => array("pipe", "r"),
   1 => array("pipe", "w"),
   2 => array("file","./error.log","w"),
						);

$process = proc_open('dir.bat', $descriptorspec, $pipes,$cwd);

if (is_resource($process)) 
{

    fwrite($pipes[0], "4");
    fwrite($pipes[0], "5");
    fclose($pipes[0]);


ob_flush();
while($pdf_content = fgets($pipes[1]))
    {  
    	echo $pdf_content .'<br>';


    	//sleep(1);

    	ob_flush();


    }  

ob_flush();

    fclose($pipes[1]);
    $return_value = proc_close($process);
}
?>

تم تعديل هذه المشاركة بواسطة feras jamal في 18 يوليو 2012 في 10:30

If your actions inspire others to dream more, learn more, do more and become more, you are a leader

Best Regards

Feras Abualrub

#5

ياريت توضع الحل حتى نستفيد

M.B.O

Mohamed Bin Othman

إبن المكلا

يابني البشر ماذا فعلتم بالبشر !!

إسـألـنـي

#6
M.B.O كتب:

ياريت توضع الحل حتى نستفيد

يا سيدي العزيز،

set_time_limit(0);

حتى ياخذ وقت لا نهائي في تنفيذ ال process في حالة انها كانت تحتاج الى وقت ، لانع في وقت معين اذا بتعداه برجعلك time out

ob_implicit_flush(0);

حتى نعمل flush لل object ولل browser عند كل قيمة نقوم بقراءتها

$descriptorspec = array(
   0 => array("pipe", "r"),
   1 => array("pipe", "w"),
   2 => array("file","./error.log","w"),
                                                );

$process = proc_open('dir.bat', $descriptorspec, $pipes,$cwd);

if (is_resource($process)) 
{

    fwrite($pipes[0], "4");
    fwrite($pipes[0], "5");
    fclose($pipes[0]);

هذا الامر يقوم بتعريف pipes لل proicess التي قمنا بخلقها بحيث يقرأ من الاول للتنفيذ ، يضع النتيجة في الثاني ، ويضع الerror في الثالث ، حيث ان الثالث قمت بتعريفه كملف وليس pipe مع العلم انه يمكنني ان اعلرف الثاني ايضا كملف

دالة proc_open

اخذت ما يلي على التوالي:

1- command اي ما يريد تنفيذه

2- array of pipes

3- pipes وهذه static مع البروسيس

4- working directory

بعد تنفيذ ال process يقوم بالكتابة با pipes ليعطي النتائج

while($pdf_content = fgets($pipes[1]))
    {  
        echo $pdf_content .'<br>';

قمنا بوضع ما تم كتابته من pipe الثاني في pdf_content

ثم قمنا بطباعة النتائج

في حالة ان commands كانت تاخذ وقت طويل وترجع اسطر كثيرة يكون النظام بطئ مع هذه الدالة

يوجد داله اخرى popen سوف اقوم باستخدامها وهي اسرع بكثير في عملية التنفيذ وجلب البيانات حيث تعمل ايضا في ال background

عندما انتهي منها سوف اقوم بكتابتها

If your actions inspire others to dream more, learn more, do more and become more, you are a leader

Best Regards

Feras Abualrub

مواضيع مشابهة