есть скрипт, который будет долго работать и постепенно формировать выходные данные, скрипт при своей работе завязан на медленную сисьему. Соответственно, наверняка сервер вывалится с таймаутом по fcgi и прибъёт процесс раньше, чем тот завершит свою работу. Городить всякие ajax или js -- обёртки желания особого да и достаточных навыков нет, соответственно кто подскажет красивые пути решения? что умеет пхп 5.3 в этой области? Одна из очевидных идей -- форкнуть и отвязать от мастера, записав pid в файл, и открыть какой-нибудь сокет и/или память расшарить как-нибудь, далее грузить страницу с автообновлением и проверкой статуса процесса, как только он завершается -- грузить результат. результат -- массив, который будет печататься в csv файл без сохранения на сревере с прямой отдачей браузеру. Жду красивых идей по реализации ну или пинков в правильное направление )
Форк это норм, еще можно выполнить команду типа Код (PHP): `php /path/to/script.php > log.txt 2> /dev/null &`;
Ну, по тому, что он собран с кучей модулей, которые на старой системе не факт что собируться без новых библиотек. Кроме того много приложений переписанных со старых версий пхп с минимальными изменениями, т.е. полно функций которых в новых версиях нет. А в пхп 5..5 есть какие-то значительные улучшения? Тут был скорее вопрос как и через что лучше сделать, сторонние приложения не хотелось бы система старая и специфичная(FreeBSD 7), так что хотелось бы обойтись средствами пхп. Да, например, так хотя, если это вызов shell -- то это не красиво и не безопасно, и тут вопрос обмена между скриптами, что можете посоветовавть?
А зачем тебе собирать что-то? Все давно собрано, цепляешь репозитории нормальные и понеслась. На 7.+ версии есть все, что было и на 5.3, бери и радуйся жизни. Например? Использование mysql_ вместо mysqli_ при том, что mysql_ было объявлено как deprecate еще 5 лет назад? Есть, я тебе больше скажу, последняя версия 5 пыхи - это 5.6. Она сильно быстрее 5.3, использует встроенный опкэшер. И...тоже устаревшая. Нонче работать надо на 7.+. Скоро вот 7.3 уже будет в релизе. А 5.3 у тебя случаем не потому, что...денвер?
FreeBSD.... Не помню уже, но врядли: у меня adodb вроде бы обновлённая.... Но там что-то совсем специфичное и рудиментароное даже 5.3 ругается на деприкейтед, я что-то, что не работало совсем -- переписал под 5.3, на остальное забил, но это было лет 10 назад.... Денвер? что это? Вряд ли, там самописное всё...
Не хотелось бы использовать ФС(насиловать диски), но в принципе, да, возможно.... хотя думал с шареной памятью будет проще.... Ну ещё надо будет каждый раз проверять содержимое на предмет того, закончен ли файл или ещё нет, ну это мелкие детали.
В общем, пока остался не совсем понятным вопрос организации ipc: предполагаю делать следующее: fork, setsid, завершение родительского процесса с перенаправлением на страницу-заглушку котороя по заголовку с авторефрешом обновляется раз в n секунд. На этой странице осуществляется проверка, закончил ли форкнутый процесс свою работу, и если закончил -- выдавать результат. Последний не очень понятный вопрос, как передавать данные между процессами, очевидная идея -- шаренная память, но как её расщарить между новый процессом страницы-заглушки и дочкой старого пооцесса, и главное, как её высвобождать по завершению работы?
Так исторически сложилось... Там много чего вертится.... По icp можете что-нибудь подсказать? Присматриваюсь к shmop но пока с правами не разобрался, они как-то привязаны к pid или реально только по системным uid/gid (это же любой левый процесс сможет нафиг всё поубивать, в теории)?
Какая задача? Память это обычно слишком дорогой ресурс для хранения генерируемых долгое время файлов.
объём памяти требуется очень небольшой, да и обращение к этому функционалу будет редкое и не параллельное. Из сокета вытаскиваю строку и парсю её в ассоциативный массив, из которого в дальнейшем будет формироваться csv-файл Проблема, что скрость формирования этого массива очень мала, т.к. сокет -- ser2net сервера соответственно, за сокетом очень старая и медленная система, в итоге скорость в районе 1 строки в секунду, всего строк менее 1000.
И это ты называешь насилованием файловой системы? Она создана для таких задач. Чтобы обозначить что файл закончен, делай две пустых строки. Проверяй просто читая 2 последних байта. Это быстро и легко, как ветер.
Приветствую общественность, вроде всё работает, но, не так как ожидалось: PHP: function create_csv($fh,$addrs){ $pid = pcntl_fork(); if ($pid == -1) { die('Не удалось породить дочерний процесс'); } else if ($pid) { // Код родительского процесса (переправляем на заглушку) header('Location: waiting.php',true, 302); echo "Redirecting.."; die; } else { //отвязываем процесс от сессии $sid = posix_setsid(); if ($sid < 0) exit; if (flock($fh, LOCK_EX)) { $arr = get_csv($addrs); ## долгоработающи функции } Заглушка: PHP: <?php $file = "/usr/local/www/data/tmp/counters.csv"; $fh = fopen($file, 'r+') or die("Error opening file"); if (flock($fh, LOCK_EX)){ echo '<a href="/tmp/counters.csv">My PHP File</a>'; sleep(15); flock($fh, LOCK_UN); } else { header('Refresh:5'); echo "Please wait"; } ?> Почему-то очень медленно происходит перенаправление. Подскажите, плз, свежим взглядом, где ошибка?