PDA

View Full Version : ناحیه بحرانی



pswin.pooya
یک شنبه 27 بهمن 1392, 23:01 عصر
سلام

راهی برای جلوگیری از ورود همزمان چندین کاربر به یه قسمت از کد php وجود داره؟

abolfazl-z
دوشنبه 28 بهمن 1392, 00:14 صبح
سلام

راهی برای جلوگیری از ورود همزمان چندین کاربر به یه قسمت از کد php وجود داره؟
سلام

فایل php کل اش رو میشه قفل کرد و همچنین قسمت های داخلی را.
تابع flock فکر کنم بهتون کمک کند.

eshpilen
دوشنبه 28 بهمن 1392, 09:22 صبح
اینم یه نمونه کد پیشنهادی سیستم محدود کردن تعداد لاگین که یک همچین حالتی داره: http://barnamenevis.org/showthread.php?297764&p=1307986&viewfull=1#post1307986

pswin.pooya
دوشنبه 28 بهمن 1392, 09:29 صبح
فایل php کل اش رو میشه قفل کرد و همچنین قسمت های داخلی را.
تابع flock فکر کنم بهتون کمک کند.
پروسس دوم که میره سراغ باز کردن فایل بلاک میشه یا اینکه نمی تونه فایل رو باز کنه و با شکست رو به رو میشه؟

abolfazl-z
دوشنبه 28 بهمن 1392, 17:15 عصر
پروسس دوم که میره سراغ باز کردن فایل بلاک میشه یا اینکه نمی تونه فایل رو باز کنه و با شکست رو به رو میشه؟

بله پروسس دوم متظر میموند که تا قفل باز بشود (یعنی پروسس قبلی کارش تموم بشه) و یادتون باشه که از set_time_limit حتما استفاده کنید تا برنامه با خطا رو به رو نشود.

این لینکم بخونین بد نیست :

مشاهده (http://abhinavsingh.com/blog/2008/11/how-does-php-echos-a-hello-world-behind-the-scene/)

pswin.pooya
دوشنبه 28 بهمن 1392, 19:00 عصر
abhinavsingh.com/blog/2008/11/how-does-php-echos-a-hello-world-behind-the-scene (http://barnamenevis.org/abhinavsingh.com/blog/2008/11/how-does-php-echos-a-hello-world-behind-the-scene/)

این لینک خرابه

abolfazl-z
دوشنبه 28 بهمن 1392, 19:06 عصر
لینک اصلاح شد.

pswin.pooya
دوشنبه 28 بهمن 1392, 19:09 عصر
set_time_limit
مطمئنید گزینه خوبیه؟! چون اگر برنامه مثلا تو ناحیه بحرانی قفل شه. اون موقع همیشه اون ناحیه قفل میمونه.



if (!function_exists('sem_get')) {
function sem_get($key) {
return fopen(__FILE__ . '.sem.' . $key, 'w+');
}
function sem_acquire($sem_id) {
return flock($sem_id, LOCK_EX);
}
function sem_release($sem_id) {
return flock($sem_id, LOCK_UN);
}
}


من یع همچین کدی رو پیدا کردم. نمی دونم تا چه اندازه استفاده از این کد میتونه safe باشه

abolfazl-z
دوشنبه 28 بهمن 1392, 19:43 عصر
مطمئنید گزینه خوبیه؟! چون اگر برنامه مثلا تو ناحیه بحرانی قفل شه. اون موقع همیشه اون ناحیه قفل میمونه.



if (!function_exists('sem_get')) {
function sem_get($key) {
return fopen(__FILE__ . '.sem.' . $key, 'w+');
}
function sem_acquire($sem_id) {
return flock($sem_id, LOCK_EX);
}
function sem_release($sem_id) {
return flock($sem_id, LOCK_UN);
}
}


من یع همچین کدی رو پیدا کردم. نمی دونم تا چه اندازه استفاده از این کد میتونه safe باشه

نگاه کنید تابع flock کل فایل php رو قفل میکنه و اجازه خواندن/نوشتن (بستگی به انتخاب دارد) نمیدهد و زمانی که اجرای اسکریپت به پایان برسه قفل باز میشه.
برای درک بهتر مثال زیر را انجام دهید :

یک فایل php ایجاد کنید و کد زیر در آن را وارد کنید :

<?php
$o = fopen('test.php','r');
flock($o,LOCK_SH);
for($i=0;$i<=10;$i++)
sleep(1);
echo 'end('.date('i:s').')';
?>
خوب حالا سه تب در مرورگر باز کنید و به ترتیب وارد فایلی که ساختید شوید.
خواهید دید که هر کدام پس از اتمام دیگری شروع به اجرا می کنند.

abolfazl-z
دوشنبه 28 بهمن 1392, 19:47 عصر
درضمن تابع set_time_limit فقط باعث جلوگیری از بروز خطای maximum execution می شود. (اصلا لازم نیست اگر اجرای اسکریپتتون طولانی نمیشه)

pswin.pooya
دوشنبه 28 بهمن 1392, 21:14 عصر
فقط یه سوال دیگه اگر اجرای اسکریپت به هر دلیلی خطا بده (توی ناحیه بحرانی) فایل قفل میمونه؟ یا اینکه با بسته شدن توصیفگر، قفل هم آزاد میشه؟

abolfazl-z
دوشنبه 28 بهمن 1392, 22:29 عصر
فقط یه سوال دیگه اگر اجرای اسکریپت به هر دلیلی خطا بده (توی ناحیه بحرانی) فایل قفل میمونه؟ یا اینکه با بسته شدن توصیفگر، قفل هم آزاد میشه؟

بله قفل آزاد میشه .

سعی کنید خطاهاتون رو مدیریت کنید.