Master-X
Регистрация
|
Вход
Форум
|
Новости
|
Статьи
Главная
»
Форум
»
Программинг, Скрипты, Софт, Сервисы
»
Тема:
-
Новая тема
Ответить
цитата
11/05/15 в 08:17
Ailk
-
Последний раз редактировалось: Ailk (
18/09/16 в 00:35
), всего редактировалось 2 раз(а)
цитата
11/05/15 в 08:23
ibiz
хотя бы строчку выложи, в которой он говорит о записи типа "тру"
цитата
11/05/15 в 09:26
Ailk
-
Последний раз редактировалось: Ailk (
18/09/16 в 00:35
), всего редактировалось 1 раз
цитата
11/05/15 в 10:32
ibiz
да, надо смотреть целиком скрипт что там не так и почему в итерации пишется, а не разом все данные после всех циклов, файлов много чтоле?
попробуй добавить LOCK_EX для блокировки файла и FILE_APPEND для дозаписи
цитата
11/05/15 в 11:07
Ailk
-
Последний раз редактировалось: Ailk (
18/09/16 в 00:35
), всего редактировалось 1 раз
цитата
11/05/15 в 12:23
ibiz
Ailk писал:
Да там ничего особенного
есть кусок, кода, который работает в кроне.
Код:
public function Process ()
{
set_time_limit(119); // 119s Limit execution time
$startTime = time();
$loopTime = 70; // 100 seconds iteration limit
$sleepTime = 1; // seconds delay
$finishTime = $startTime + $loopTime;
while (time() < $finishTime) {
if (! $this->stoppedScript()) {
$this->rebuidPostImage();
}
sleep ($sleepTime);
}
}
Он в общем управляет временем работы скрипта. в данном случае лимит 2минуты, между запусками крона.
вот. на обработку поста уходит примерно 3-10 секунд (~30 картинок). Как видно из первого куса, из отрезка в 119 секунд цикл работает всего 70. но поидее мог бы работать и 100 к примеру. Однако, если ставлю 100 то скрипт всегда завершается принудительно по истечению лимита времени при этом всегда выдает ошибку записи тумбы. Такое случается (редко, но бывает) даже на отрезке выполнения в 80 секунд, когда посты обработаны уже все и не случается вообще на отрезке в 70 секунд.
эта конструкция может работать, но будут возникать ошибки, например, на слабой машине (при сильной загрузке ЦП, при уходе в своп), вариант, что на обработку поста уйдет не 3-10 секунд, а все 60, в итоге запустится два крона подряд и результаты предыдущего будут утеряны, возможно?
у меня работает по крону скрипт, который импортирует базу данных около 1-2 гига туда-сюда, занимает это действо 5-30 минут, крон запускается каждую минуту
использую файл лок для отслеживания выполнения скрипта:
Код:
$fd = fopen('lock.file', 'w+');
// try to get an exclusive lock. LOCK_NB let the operation not blocking
// if a process instance is already running. In this case, the else
// block will being entered.
if(flock($fd, LOCK_EX | LOCK_NB )) {
// your task's code comes here
sleep(10);
// ...
flock($fd, LOCK_UN);
echo 'success';
$exitcode = 0;
} else {
echo 'already running';
// return 2 to let check.php know about that
// task.php is already running
$exitcode = 2;
}
fclose($fd);
exit($exitcode);
цитата
11/05/15 в 13:04
Ailk
-
Последний раз редактировалось: Ailk (
18/09/16 в 00:34
), всего редактировалось 1 раз
цитата
11/05/15 в 13:27
Ailk
-
Последний раз редактировалось: Ailk (
18/09/16 в 00:34
), всего редактировалось 1 раз
цитата
11/05/15 в 14:01
Stek
А серв физический или vps на openvz к примеру ?
цитата
11/05/15 в 14:34
Ailk
-
Последний раз редактировалось: Ailk (
18/09/16 в 00:34
), всего редактировалось 1 раз
цитата
11/05/15 в 16:09
Stek
Попробую админов спросить. Сам пхп не может так кешировать. Т.е. делается это скорее всего на уровне системы.
Как вариант, после записи каждого файла вызывать clearstatcache();, может поможет.
цитата
11/05/15 в 17:41
ibiz
Ailk писал:
В том и дело что ошибки возникают при принудительном завершении скрипта (сет_тайм_лимит(119)). Но, в отведенный интервал в 70 секунд скрипт работает, потом стоит. Это видно на счетчике из другого скрипта (прогресс трекер). Во время этого простоя продолжают записыватся тумбы. После принудительного завершения как ни странно данные не теряются (даже с интервалом в 100 и фатал еррором). Т.е. все равно сохраняется через некоторое время. Но в теории они могут потерятся если серв крашнется или ребутнут его.
серв довольно мощный. при пиковой (чуть более 11к одновременно сидящих онлайн) загрузке проц едва доходит до 50%
то есть данные совсем не теряются, а просто пишутся с задержкой, даже если скрипт убить? сомневаюсь, что эта проблема на уровне рнр
цитата
11/05/15 в 19:30
johndoe2
Stek писал:
Попробую админов спросить. Сам пхп не может так кешировать. Т.е. делается это скорее всего на уровне системы.
Как вариант, после записи каждого файла вызывать clearstatcache();, может поможет.
не clearstatcache, а fflush
Ailk проблема у тебя слишком специфическая. вряд ли форумные разговоры помогут ее решить в разумное время. это нужно прямо на сервере смотреть, что происходит с процессом, и действительно ли он убивается
цитата
11/05/15 в 20:18
Ailk
-
Последний раз редактировалось: Ailk (
18/09/16 в 00:34
), всего редактировалось 1 раз
цитата
11/05/15 в 20:58
Stek
johndoe2 писал:
не clearstatcache, а fflush
Возможно. А лучше то и другое, можно побольше
Ailk писал:
да может это просто особенности работы функций записи
Для пхп это не свойственно. У тебя случае какого нибудь кеширования на уровне системы нет ?
Как вариант возьми пару больших файлов и попробуй в другую директорию скопировать. Если будет мгновенное или не равномерное копирование - у тебя хостеры что то намудрили, видимо для уменьшения интенсивности записи на SSD.
цитата
12/05/15 в 21:03
rickdeckard
Ailk писал:
Короче наткнулся на такую херню. Значит есть некий скрипт, режет тумбы там копирует картинки, ну как обычно в общем. Обнаружил недавно что он записывает как бы постфактум на диск. Т.е. скрипт выполняется, в определенный момент записывается файл, сообщение о записи типа "тру" но на самом деле он не записался сразу, а записался гораздо позже (уже после нескольких итераций цикла). Задержки бывают до 40секунд. Как так вообще получается, ктонить знает? Серв нагружен на дисках(ссд) до 60% всего.
ого - какойто асинхронный php
цитата
12/05/15 в 21:04
rickdeckard
Ailk писал:
Код:
if(file_put_contents($file, $content))
return true;
как-то так. Если запись не получается вернет ноль (прав там нет, папки не существует или еще какая херь)
> Функция возвращает количество записанных байт в файл, или FALSE в случае ошибки.
http://php.net/manual/ru/function.file-put-contents.php
пробовали сверять длину данных и результат от функции?
цитата
12/05/15 в 21:08
rickdeckard
Ailk писал:
if (file_put_contents($thumbFile, $this->thumbler)) {
вот это непонял есть же функция которая изображение в файл пишет.
http://php.net/manual/ru/function.imagejpeg.php
или
http://php.net/manual/ru/imagick.writeimage.php
цитата
13/05/15 в 17:17
Ailk
-
Последний раз редактировалось: Ailk (
18/09/16 в 00:34
), всего редактировалось 1 раз
цитата
14/05/15 в 00:30
Pentarh
Мож это какая-то особенность файловой системы SSD диска? Вывод команды mount в студию.
цитата
31/05/15 в 10:05
rickdeckard
Ailk писал:
Однажды столкнулся с проблемой этих функций, они наотрез отказывались писать в файл, с тех пор не использую их вовсе, во избежание так сказать.
незнаю, может версия php старая или собирали криво.
вы пишете свою обработку изображений php?
а внешнюю утилиту imagick не пробовали?
цитата
31/05/15 в 10:06
rickdeckard
rickdeckard писал:
незнаю, может версия php старая или собирали криво.
вы пишете свою обработку изображений php?
а внешнюю утилиту imagemagick не пробовали?
цитата
31/05/15 в 10:11
Ailk
-
Новая тема
Ответить
Эта страница в полной версии