PDA

View Full Version : کلاسی برای خواندن و نوشتن در فایل



sattaryekta
پنج شنبه 12 اسفند 1389, 10:02 صبح
برای بروز خطای کمتر، فایل را Lock می کند.

class OrdUpIO{
private $fp = null;
private $filename = null;
private $data = null;
function OrdupIO($filename){
if(file_exists($filename)){
$this->filename = $filename;
if($this->fp = fopen($this->filename,"r+")){
while(!flock($this->fp,LOCK_EX | LOCK_NB )){
$r = rand(5,50) * 1000;
usleep($r);
}
}
}
}
function GetLastModified(){
clearstatcache();
return filemtime($this->filename);
}
function get(){
if($this->fp){
if(!$this->data){
$this->data = stream_get_contents($this->fp);
}
return $this->data;
}
}
function put($data){
if($this->fp){
$this->data = $data;
ftruncate($this->fp,0);
if($this->data){
rewind($this->fp);
for ($written = 0; $written < strlen($this->data); $written += $fwrite) {
$fwrite = fwrite($this->fp, substr($this->data, $written));
if ($fwrite === false) {
break;
}
}
}
}
}
function close($save=true){
if($this->fp){
$this->data = null;
flock($this->fp, LOCK_UN);
fclose($this->fp);
}
}
}

amir001
شنبه 14 اسفند 1389, 23:17 عصر
while(!flock($this->fp,LOCK_EX | LOCK_NB )){ $r = rand(5,50) * 1000; usleep($r); }

این قسمت به نظر میرسه جالب نباشه.
ممکنه فایل دست یکی باشه که نخواد به این زودیها بیخیالش بشه...

skyline
شنبه 06 فروردین 1390, 00:34 صبح
با سلام
من flock رو بارها تست کردم اگر یک فایل رو باز کنید و اونرو قفل کنید و روش رایت کنید مینویسه اگر بعدش توقف بذارید مثلا 10 ثانیه و همون فایل رو تو برنامه دیگه باز کنید فایل باز میشه و اونجا هم میشه توش نوشت بدون اینکه در فایل اول اونرو آزاد کرده باشید آیا مشکل از تحت ویندوز بودن سرور ؟
من یه مشکل جالب دیگه هم برخورد کردم تابع set_time_limit در سرور های لینوکس کار نمیکنه آیا از دوستان کسی تست کرده ؟

binyaft
شنبه 06 فروردین 1390, 11:43 صبح
سرور دسترسی به php.ini رو بسته .

skyline
شنبه 06 فروردین 1390, 12:04 عصر
منظور از کار نکردن دادن خطا نیست بی تاثیر بودن این دستور.
به بسته بودن php.ini ربطی نداره توی manual php نوشته فقط تحت safe mode کار نمیکنه پیش فرض این مقدار 30 ثانیه هست که با phpinfo میشه مقدار رو پیدا کرد هنگام تغییر توسط set_time_limit خطا هم نمیدهد حتی مدیر سرور زمان رو به 60 ثانیه تغییر داد ولی تاثیری نداشت .
اگر کسی سرور لینوکس داره و تست کرده و جواب داده در صورت امکان سرویس دهنده رو معرفی کنه .
در مورد flock چطور ؟

<?php

set_time_limit(60);

$counter=0;

while (++$counter<180)
{
sleep(1);
if ($counter>50) echo "end = ".$counter." sec\r\n";
}


?>

برنامه تا 180 ثانیه میشماره با وجود دستور محمدود کننده زمان باید 60 ثانیه کار کنه ولی تا 180 ثانیه میره و با تمام شدن حلقه خارج میشه
تحت سرور ویندوز مشکلی نداره ولی توی سرور لینوکس مشکل داره ( 3 تا سرور مختلف رو تست کردم )