За последние 24 часа нас посетили 62754 программиста и 1771 робот. Сейчас ищут 863 программиста ...

php + fork или?

Тема в разделе "PHP для новичков", создана пользователем NewUse, 4 сен 2018.

  1. NewUse

    NewUse Новичок

    С нами с:
    14 июл 2018
    Сообщения:
    46
    Симпатии:
    0
    есть скрипт, который будет долго работать и постепенно формировать выходные данные, скрипт при своей работе завязан на медленную сисьему. Соответственно, наверняка сервер вывалится с таймаутом по fcgi и прибъёт процесс раньше, чем тот завершит свою работу.

    Городить всякие ajax или js -- обёртки желания особого да и достаточных навыков нет, соответственно кто подскажет красивые пути решения? что умеет пхп 5.3 в этой области?

    Одна из очевидных идей -- форкнуть и отвязать от мастера, записав pid в файл, и открыть какой-нибудь сокет и/или память расшарить как-нибудь, далее грузить страницу с автообновлением и проверкой статуса процесса, как только он завершается -- грузить результат.

    результат -- массив, который будет печататься в csv файл без сохранения на сревере с прямой отдачей браузеру.

    Жду красивых идей по реализации ну или пинков в правильное направление :))
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    5.3? Очевидный вопрос - почему?
    Меморишардеров кучи есть как отдельных приложений.
     
  3. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Форк это норм, еще можно выполнить команду типа
    Код (PHP):
    1. `php /path/to/script.php > log.txt 2> /dev/null &`;
     
  4. NewUse

    NewUse Новичок

    С нами с:
    14 июл 2018
    Сообщения:
    46
    Симпатии:
    0
    Ну, по тому, что он собран с кучей модулей, которые на старой системе не факт что собируться без новых библиотек.
    Кроме того много приложений переписанных со старых версий пхп с минимальными изменениями, т.е. полно функций которых в новых версиях нет.
    А в пхп 5..5 есть какие-то значительные улучшения?
    Тут был скорее вопрос как и через что лучше сделать, сторонние приложения не хотелось бы система старая и специфичная(FreeBSD 7), так что хотелось бы обойтись средствами пхп.
    Да, например, так хотя, если это вызов shell -- то это не красиво и не безопасно, и тут вопрос обмена между скриптами, что можете посоветовавть?
     
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    А зачем тебе собирать что-то? Все давно собрано, цепляешь репозитории нормальные и понеслась. На 7.+ версии есть все, что было и на 5.3, бери и радуйся жизни.
    Например? Использование mysql_ вместо mysqli_ при том, что mysql_ было объявлено как deprecate еще 5 лет назад?

    Есть, я тебе больше скажу, последняя версия 5 пыхи - это 5.6. Она сильно быстрее 5.3, использует встроенный опкэшер. И...тоже устаревшая. Нонче работать надо на 7.+. Скоро вот 7.3 уже будет в релизе.

    А 5.3 у тебя случаем не потому, что...денвер?
     
  6. NewUse

    NewUse Новичок

    С нами с:
    14 июл 2018
    Сообщения:
    46
    Симпатии:
    0
    FreeBSD....
    Не помню уже, но врядли: у меня adodb вроде бы обновлённая.... Но там что-то совсем специфичное и рудиментароное даже 5.3 ругается на деприкейтед, я что-то, что не работало совсем -- переписал под 5.3, на остальное забил, но это было лет 10 назад....

    Денвер? что это?
    Вряд ли, там самописное всё...
     
  7. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Подумайте над простыми файлами. Это шустро, просто и временная метка сразу есть.
     
  8. NewUse

    NewUse Новичок

    С нами с:
    14 июл 2018
    Сообщения:
    46
    Симпатии:
    0
    Не хотелось бы использовать ФС(насиловать диски), но в принципе, да, возможно.... хотя думал с шареной памятью будет проще....

    Ну ещё надо будет каждый раз проверять содержимое на предмет того, закончен ли файл или ещё нет, ну это мелкие детали.
     
  9. NewUse

    NewUse Новичок

    С нами с:
    14 июл 2018
    Сообщения:
    46
    Симпатии:
    0
    В общем, пока остался не совсем понятным вопрос организации ipc:
    предполагаю делать следующее:
    fork, setsid, завершение родительского процесса с перенаправлением на страницу-заглушку котороя по заголовку с авторефрешом обновляется раз в n секунд.

    На этой странице осуществляется проверка, закончил ли форкнутый процесс свою работу, и если закончил -- выдавать результат.

    Последний не очень понятный вопрос, как передавать данные между процессами, очевидная идея -- шаренная память, но как её расщарить между новый процессом страницы-заглушки и дочкой старого пооцесса, и главное, как её высвобождать по завершению работы?
     
  10. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Oh god, why...
     
  11. NewUse

    NewUse Новичок

    С нами с:
    14 июл 2018
    Сообщения:
    46
    Симпатии:
    0
    Так исторически сложилось... Там много чего вертится....
    По icp можете что-нибудь подсказать? Присматриваюсь к shmop но пока с правами не разобрался, они как-то привязаны к pid или реально только по системным uid/gid (это же любой левый процесс сможет нафиг всё поубивать, в теории)?
     
  12. NewUse

    NewUse Новичок

    С нами с:
    14 июл 2018
    Сообщения:
    46
    Симпатии:
    0
    так по поводу шареной памяти кто, что скажет?
     
  13. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Какая задача? Память это обычно слишком дорогой ресурс для хранения генерируемых долгое время файлов.
     
  14. NewUse

    NewUse Новичок

    С нами с:
    14 июл 2018
    Сообщения:
    46
    Симпатии:
    0
    объём памяти требуется очень небольшой, да и обращение к этому функционалу будет редкое и не параллельное.
    Из сокета вытаскиваю строку и парсю её в ассоциативный массив, из которого в дальнейшем будет формироваться csv-файл
    Проблема, что скрость формирования этого массива очень мала, т.к. сокет -- ser2net сервера соответственно, за сокетом очень старая и медленная система, в итоге скорость в районе 1 строки в секунду, всего строк менее 1000.
     
  15. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    И это ты называешь насилованием файловой системы? Она создана для таких задач.
    Чтобы обозначить что файл закончен, делай две пустых строки. Проверяй просто читая 2 последних байта. Это быстро и легко, как ветер.
     
  16. NewUse

    NewUse Новичок

    С нами с:
    14 июл 2018
    Сообщения:
    46
    Симпатии:
    0
    Ок, спасибо, а чем так плохо использования шаренной памяти?Или, например, сокета для реализации ipc?
     
  17. NewUse

    NewUse Новичок

    С нами с:
    14 июл 2018
    Сообщения:
    46
    Симпатии:
    0
    Приветствую общественность, вроде всё работает, но, не так как ожидалось:
    PHP:
    1. function create_csv($fh,$addrs){
    2.     $pid = pcntl_fork();
    3.     if ($pid == -1) {
    4.          die('Не удалось породить дочерний процесс');
    5.     } else if ($pid) {
    6.               // Код родительского процесса (переправляем на заглушку)
    7.             header('Location: waiting.php',true, 302);
    8.             echo "Redirecting..";
    9.             die;
    10.     } else {
    11. //отвязываем процесс от сессии
    12.         $sid = posix_setsid();
    13.         if ($sid < 0) exit;
    14.         if (flock($fh, LOCK_EX)) {
    15.             $arr = get_csv($addrs);
    16. ## долгоработающи функции
    17. }
    Заглушка:

    PHP:
    1. <?php
    2. $file = "/usr/local/www/data/tmp/counters.csv";
    3. $fh = fopen($file, 'r+') or die("Error opening file");
    4. if (flock($fh, LOCK_EX)){
    5.     echo '<a href="/tmp/counters.csv">My PHP File</a>';
    6.     sleep(15);
    7.     flock($fh, LOCK_UN);
    8. } else {
    9.     header('Refresh:5');
    10.     echo "Please wait";
    11. }
    12.  
    13. ?>
    Почему-то очень медленно происходит перенаправление. Подскажите, плз, свежим взглядом, где ошибка?
     
  18. NewUse

    NewUse Новичок

    С нами с:
    14 июл 2018
    Сообщения:
    46
    Симпатии:
    0
    по всей видимости проблема в заглушке, но не нахожу, где...
     
  19. NewUse

    NewUse Новичок

    С нами с:
    14 июл 2018
    Сообщения:
    46
    Симпатии:
    0
    "Please wait" не выводит :( сразу ссыль на готовый файл...
    Не пойму в чём причина....
     
  20. NewUse

    NewUse Новичок

    С нами с:
    14 июл 2018
    Сообщения:
    46
    Симпатии:
    0
    не ужели никто не знает, вроде типичная задача?
     
  21. NewUse

    NewUse Новичок

    С нами с:
    14 июл 2018
    Сообщения:
    46
    Симпатии:
    0