SQL не будет выполняться после fopen fwrite большого файла

Я использую fopen, fwrite и fclose для перезаписи файла. Когда я перезаписываю большой файл размером 50 МБ, файл успешно перезаписывается, но оператор sql после fclose не выполняется, и эхо внизу не выполняется. SQL выполняется для файлов размером 20 МБ.

Любые идеи?

set_time_limit(10000);

if (!file_exists($filename)) {
echo "file missing";
}
else{   
$fr = fopen($filename, "r"); 
$file = "";
$file = fgets($fr, 4096);
while(!feof($fr)){ 

//read from file

    $file =str_replace("\r","",$file);
    $file =str_replace("\n","",$file);
    $file =str_replace("~","",$file);

//write to file
    $fw = fopen($tempfile, "a") or die("Couldn't create new file"); 
    fwrite($fw, $file); 
    $file = fgets($fr, 4096); 
     } 
fclose($fw);
fclose($fr); 

//set status to 5
$update_stmt = $mysqli->prepare("Update bs_uploads set UploadStatus=5 where 
UploadNewFilename=?");
$update_stmt->bind_param("s", $original_filename);
$update_stmt->execute();

 echo "finished";   

}

person JoeyA    schedule 15.07.2017    source источник
comment
Вы уверены, что запуск больших файлов не занимает больше 10 секунд? У вас есть set_time_limit(10000);. Вы пытались увеличить это значение?   -  person Jeff Kilbride    schedule 15.07.2017
comment
ограничение по времени 10000 секунд, файл полностью перезаписывается независимо от его размера, просто sql после не   -  person JoeyA    schedule 15.07.2017
comment
Попробуйте добавить error_reporting(E_ALL); ini_set('display_errors', 1); в качестве двух верхних строк вашего кода, посмотрите, не сообщается ли что-нибудь.   -  person Nigel Ren    schedule 15.07.2017
comment
спасибо, Найджел, помог   -  person JoeyA    schedule 16.07.2017


Ответы (2)


Одна вещь, которая вызовет проблемы, заключается в том, что вы открываете выходной файл для каждого фрагмента файла, который вы читаете...

$fr = fopen($filename, "r");
$fw = fopen($tempfile, "w") or die("Couldn't create new file"); 

$file = "";
$file = fgets($fr, 4096);
while(!feof($fr)){ 

//read from file

    $file =str_replace("\r","",$file);
    $file =str_replace("\n","",$file);
    $file =str_replace("~","",$file);

//write to file
    //$fw = fopen($tempfile, "a") or die("Couldn't create new file"); 
    fwrite($fw, $file); 
    $file = fgets($fr, 4096); 
     } 
fclose($fw);
fclose($fr); 

Не уверен, что это вызывает проблему, с которой вы столкнулись, но открытие большого количества файлов вызовет проблему.

person Nigel Ren    schedule 15.07.2017
comment
Спасибо, Найджел, я отключил fopen, но результат тот же. - person JoeyA; 15.07.2017

Кажется, что соединение mysqli теряется, когда скрипт работает в течение длительного времени. Я решил это, переместив оператор подключения, который у меня был вверху страницы, чуть выше моих операторов обновления sql.

fclose($fw);
fclose($fr); 

include("connect_mysqli.inc.php");

//set status to 5
$update_stmt = $mysqli->prepare("Update bs_uploads set UploadStatus=5 where 
UploadNewFilename=?");
$update_stmt->bind_param("s", $original_filename);
$update_stmt->execute();

echo "finished";   

}
person JoeyA    schedule 16.07.2017