PDA

View Full Version : سوال: در رابطه با الگوریتم FIFO



680100
یک شنبه 30 فروردین 1394, 15:45 عصر
سلام دوستان

بچه ها یک سوال در رابطه با الگوریتم FIFO دارم

می خوام بدونم این الگوریتم در PHP اماکان پذیر هست ؟

اگه میشه یه مثال ساده از الگوریتم فیفو بگید به صورت خیلی ساده

ممنون

reza_alie
یک شنبه 30 فروردین 1394, 16:29 عصر
سلام دوست عزیز
به عنوان مثال میشه با دیتابیس و phpاین کارو انجام داد یعنی اولین رکوردی که در بانک ذخیره می شود پردازش شود و بلعکس
و یا با آرایه می شه این کارو انجام داد یعنی از اولین خانه آرایه شروع به خواندن بکند و پس اتمام خواندن آن را حذف کند
اگه متوجه نشدی بگو بیشتر توضیح بدم

یاعلی
موفق باشی

680100
یک شنبه 30 فروردین 1394, 16:34 عصر
هر چی تو نت گشتم در مورد fifo در php پیدا نکردم همشون تحت ویندوز و داس بودند

اگه میشه بیشتر توضیح بدید به همراه مثال
مثال دررابطه با دیتابیس یا آرایه باشه هر کدوم راحت بشه توضیح داد تا من متوجه منظور بشم
مثال ساده ، به صورت شئی گرای نباشه

ممنون

reza_alie
یک شنبه 30 فروردین 1394, 16:39 عصر
ببین دوست عزیز به مثال زیر توجه کن:


<?php

/**
* @author Reza Ali
* @copyright 2015
*/
echo "قبل از اجرا";
echo '<pre>';
$queue = array('reza', 'alie');
$queue[] = 'hamed';
array_push($queue, 'saeed', 'barnamenevis.org');
print_r($queue);
echo '<br>';
echo "بعد از اجرا";
echo '<br>';
$next = array_shift($queue);
print_r($queue);

?>
ببین کلمهreza اولین خانه ارایه هستش و سپس تعداد مقدار در ادامه به آرایه اضافه می شود و پس از اضافه شدن اولین خانه آرایه حذف می شود شما می تونید این عمل رو داخل حلقه بندازید
موفق باشی

reza_alie
یک شنبه 30 فروردین 1394, 16:48 عصر
اینم کاملش امیدوارم که مورد پسندت واقع شده باشه



<?php

/**
* @author Reza Ali
* @copyright 2015
*/
echo "قبل از اجرا";
echo '<pre>';
$queue = array('reza', 'alie');
$queue[] = 'hamed';
array_push($queue, 'saeed', 'barnamenevis.org');
print_r($queue);
echo '<br>';
echo'<hr>';

echo "بعد از اجرا";
echo '<br>';
$j=count($queue);
for($i=0;$i<$j;$i++)
{
array_shift($queue);
print_r($queue);
}
if(count($queue)==0){
echo "صف خالی است";

}


?>
موفق باشی
یاعلی

680100
یک شنبه 30 فروردین 1394, 16:56 عصر
جالب بود
حالا بیایم توسعه ش بدیم

--------------

داشتم همین رو می نوشتم که هر بار اجرا رو نمایش بده و صف خالی بشه
حالا میشه برای هر بار که حلقه انجام بشه مدت زمان اجرای را بدست آورد ؟
یعنی به فرض مثال چند میلی ثانیه زمان برده که هر بار حلقه اجرا شده

reza_alie
یک شنبه 30 فروردین 1394, 16:58 عصر
اگه این حالت رو می خوای میتونی از آرایه key/valueاستفاده کنی یعنی قسمت keyآرایه مشخص کنی که این خانه چقدر زمان جهت اجرا نیاز دارد و در انتها آن مقدار یا جمع کل را بدست بیاری

680100
یک شنبه 30 فروردین 1394, 17:03 عصر
یعنی از حالت فور اچ ؟


forech($array as $key => $value){

/*
* code here ?
*/

}

reza_alie
یک شنبه 30 فروردین 1394, 17:08 عصر
یعنی از ابتدا به این صورت تعریف کنی


$queue = array('reza'=>5, 'alie'=>1);

680100
یک شنبه 30 فروردین 1394, 17:15 عصر
یک سوال دیگه
این فاکشن کاربردش چیه که از fifo اسم برده ؟


posix_mkfifo()
http://php.net/manual/en/function.posix-mkfifo.php

-سیّد-
یک شنبه 30 فروردین 1394, 20:34 عصر
یک سوال دیگه
این فاکشن کاربردش چیه که از fifo اسم برده ؟


posix_mkfifo()
http://php.net/manual/en/function.posix-mkfifo.php

با تشکر از توضیحات عالی دوستمون

این fifo یه کم با اون fifo فرق می‌کنه. توضیح:
توی ویندوز و داس، یا فایل داریم، یا دایرکتوری (یا فولدر یا پوشه). اما توی سیستم‌های unix-based اینطوری نیست. همه چیز فایل هست، و این نوع فایل هست که فرق می‌کنه. یعنی یه directory هم توی unix یه جورایی فایل هست.
حالا انواع فایل توی unix اینها هستند (که می‌تونید از طریق فراخوانی تابع filetype (http://php.net/manual/en/function.filetype.php) نوع یه فایل رو متوجه بشید):

file: این همون فایل معمولی خودمون هست (بهش regular هم می‌گن).
dir: دایرکتوری، بدون شرح!
link: یا symlink (مخفف symbolic link) که یعنی اشاره‌گر به یه فایل دیگه (مشابه shortcut توی ویندوز، ولی خیییییییلی فراتر از shortcut!)
fifo: (که همینجا بحثش مطرح شده) این نوع فایل، یه نوع مخصوص هست که همونطور که توی توضیح همون تابع posix_mkfifo نوشته شده:


posix_mkfifo() creates a special FIFO file which exists in the file system and acts as a bidirectional communication endpoint for processes.
این نوع فایل، یک روش برای ایجاد ارتباط بین process ها هست (IPC: Inter-Process Communication). مثال‌های دیگه‌ای از IPC شامل فایل‌های معمولی، شبکه، پایگاه داده، shared memory و ... می‌شه.


char: به پایینی مراجعه کنید!
block: این و بالایی (یعنی char) مشخص کننده‌ی یه device هستن. توی یونیکس دو جور device تعریف می‌شه: character device و block device. ارتباط با character device ها به صورت character به character هست، و ارتباط با block device ها به صورت دسته‌ای. مثلاً ارتباط با console (فکر می‌کنم) به صورت character هست و ارتباط با printer به صورت block (ممکنه در این مورد یه کم اشتباه کنم، لطفاً اگه اشتباهه بفرمایید).
socket: برای ارتباط شبکه‌ای استفاده می‌شه. یعنی هر connection ای که توی لینوکس به یه سیستم دیگه برقرار می‌شه، یه فایل از نوع socket ساخته می‌شه که اطلاعات اون connection رو توی خودش داره (می‌تونید برای مشاهده‌ی این جور فایل‌های خاص، به دایرکتوری proc/ توی فایل سیستم لینوکس مراجعه کنید، توضیحش اینجا نمی‌گنجه!).
unknown: یعنی یه نوع فایلی که سیستم به هر دلیلی نتونسته بشناسش.


خلاصه: این fifo که مطرح کردید، یه جور فایل هست که برای ارتباط بین process ها ازش استفاده می‌شه. دلیل نامگذاریش هم اینه که ساختار استفاده شده داخلش، به صورت fifo هست. به این صورت که شما توی یه process توسط این تابع یه fifo می‌سازید، که ۲ سر داره. یه سرش رو می‌دید به یه process، و یه سر دیگه‌اش رو می‌دید به یه process دیگه. حالا این دو تا process می‌تونن از طریق نوشتن و خوندن از/به این فایل‌ها، با هم صحبت کنن. مثل socket که بین client و server برقرار می‌شه و با هم صحبت می‌کنن، با این تفاوت که socket سنگین‌تر از pipe هست (به این fifo مورد بحث، pipe هم می‌گن) و معمولاً برای ارتباطات remote استفاده می‌شه. ولی اگه می‌خواین داخل یه سیستم دو تا process رو به هم ارتباط بدین، یکی از سریع‌ترین راه‌ها pipe هست (shared memory هم سرعتش عالیه، چون داخل RAM هست).

این نکته رو هم دقت کنید که این موضوعاتی که گفتم، هیییییییچ ارتباطی به PHP ندارن و مفاهیم مرتبط با unix هستن. پس ارتباطشون به PHP چیه؟ اینه که PHP توسط این تابع که گفتید (و توابع مشابه دیگه) امکان استفاده از این مفاهیم رو توی سیستم‌های unix-based فراهم می‌کنه. یعنی اگه توی ویندوز این تابع رو استفاده کنید، فحشتون می‌ده! می‌تونید امتحان کنید! :لبخندساده: (به اینجا مراجعه کنید: http://php.net/manual/en/intro.posix.php )


Note: This extension is not available on Windows platforms.



این extension هم مرتبط هست با این موضوع: http://php.net/manual/en/intro.pcntl.php

پ.ن. برای دیدن نوع فایل توی لینوکس، می‌تونید از دستور
ls -l استفاده کنید. اون گوشه سمت چپ چپ که دسترسی‌های فایل‌ها رو می‌نویسه، اولین چیزی که می‌نویسه نوع فایل هست که اگه فایل معمولی باشه یه خط فاصله می‌ذاره، اگه دایرکتوری باشه d می‌ذاره و الی آخر.
این هم توضیحات کاملش در ویکیپدیا (انصافاً اگه از اول ویکیپدیاش رو دیده بودم این همه تایپ نمی‌کردم! http://barnamenevis.org/images/smilies/yahoo/106.gif ) : http://en.wikipedia.org/wiki/Unix_file_types

680100
یک شنبه 30 فروردین 1394, 22:07 عصر
جالب بود
حالا بیایم توسعه ش بدیم

--------------

داشتم همین رو می نوشتم که هر بار اجرا رو نمایش بده و صف خالی بشه
حالا میشه برای هر بار که حلقه انجام بشه مدت زمان اجرای را بدست آورد ؟
یعنی به فرض مثال چند میلی ثانیه زمان برده که هر بار حلقه اجرا شده


اگه این حالت رو می خوای میتونی از آرایه key/valueاستفاده کنی یعنی قسمت keyآرایه مشخص کنی که این خانه چقدر زمان جهت اجرا نیاز دارد و در انتها آن مقدار یا جمع کل را بدست بیاری


ممنون سید جان بابت توضیح کاملتون ، پس اینطوره .

سید جان میشه راجب این سوال من که نقل قول کردم و دوست عزیزمون یه توضیحی داد جواب بدید که به چه صورت هست ؟

-سیّد-
یک شنبه 30 فروردین 1394, 22:30 عصر
سید جان میشه راجب این سوال من که نقل قول کردم و دوست عزیزمون یه توضیحی داد جواب بدید که به چه صورت هست ؟
فکر می‌کنم اینجا یه سوء تفاهم شده! یعنی به نظر می‌رسه دوستمون منظور شما رو درست متوجه نشدن.
چیزی که من از سؤال شما فهمیدم، اینه که می‌خواین توی یه حلقه کل المان‌های داخل یک صف رو بردارید، و هر بار که یکی رو بر می‌دارید، زمان برداشتن رو محاسبه کنید. درسته؟
اگه برداشت من درست باشه، می‌تونید به این صورت زمان اجرای یه بخش از کد رو محاسبه کنید:


$t1 = microtime(true);
// اینجا یه کاری انجام بدید
$t2 = microtime(true);
$delta = $t2 - $t1;
echo "time: $delta<br />\n";

توی کد بالا، مدت زمان اجرای اون بخش که کامنت شده با دقت میکروثانیه محاسبه و چاپ می‌شه.
دلیل این که به جای تابع time (http://ir.php.net/manual/en/function.time.php) از تابع microtime (http://ir.php.net/manual/en/function.microtime.php) استفاده کردم این بود که کاری که شما می‌خواین زمانش رو محاسبه کنین (برداشتن یک المان از یک صف) تقریباً هیچی زمان نمی‌بره! به عنوان نمونه، کد زیر رو اجرا کردم:


<?php
$a = array('a', 'b', 'c');
while(!empty($a)) {
$t1 = time();
$x = array_shift($a);
$t2 = time();
$delta = $t2 - $t1;
echo "=> $x ==> $delta<br />\n";
}

خروجی شد این:


=> a ==> 0
=> b ==> 0
=> c ==> 0

حالا اگه از microtime استفاده کنیم:


<?php
$a = array('a', 'b', 'c');
while(!empty($a)) {
$t1 = microtime(true);
$x = array_shift($a);
$t2 = microtime(true);
$delta = $t2 - $t1;
echo "=> $x ==> $delta<br />\n";
}

خروجی می‌شه این:


=> a ==> 2.3841857910156E-5
=> b ==> 4.0531158447266E-6
=> c ==> 1.9073486328125E-6

البته اینجا انقد عددا کوچیک هستن که هزار تا عامل توشون مؤثر هست. مثلاً یه بار دیگه اجرا کردم، شد این:


=> a ==> 8.1062316894531E-6
=> b ==> 2.8610229492188E-6
=> c ==> 2.1457672119141E-6