Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
[PHP] управление процессами
|
|||
|---|---|---|---|
|
#18+
Всем привет! У меня стоит задача которую я могу решить двумя способами, но вот какой из них правильней, т.е с наименьшим потреблением ресурсов - я не знаю, по этому хочу услышать совет умных людей)). Есть у меня PHP скрипт который запускается при подключении к сокету (порту) удаленным устройством. После подключения скрипт получает побайтовый поток ввода STDIN (данные от устройства). Каждое подключение - это отдельный северный процесс (дочерний). Я понимаю об управлении процессами, знаю что такое дочерний, зомби процесс,отправка сигнала процессу,PID и все остальное касательно процессов и php. Задача - установить таймаут завершения процесса (скрипта), который принимает данные по STDIN. Но в том случае, если данных нет к примеру 3600 секунд. Т.е не один байт не передавался, но скрипт продолжает ожидать данные (байтовый поток). Как я пытаюсь решить задачу. При получении данных, принимающий скрипт записывает PID процесса и время запуска в лог. После каждой интеграции цикла в скрипте (одна интеграция это получение какого то количества байт) скрипт обновляет время в файле лога. В случае удачного завершения получения данных, (т.е удаленное устройство корректно закрыло сокет) запись с файла логов удаляется. Другой скрипт который работает по крону, каждые 3600 секунд проверяет файл логов PID и в случае если время между текущим и записанным по какому то процессу привышает 3600 сек, посылается сигнал процессу на корректное завершение. Проблема в том - как хранить файлы логов и как осуществлять к ним доступ? Важно то, что нельзя использовать DB. Т.е использовать один файл для всег логов, и с одной стороны к нему будет очередь за запись, с другой стороны на чтение. Боюсь что буду задержки. С другой стороны можно просто создавать файл PID_time.pid под каждый процесс и проверять наличие этих файлов кроном. В любом случае - возможно что то посоветуете вы?* Заранее благодарен! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2012, 12:39 |
|
||
|
[PHP] управление процессами
|
|||
|---|---|---|---|
|
#18+
Electric200, не утверждаю, но что-то мне кажется ваша система чересчур сложной. Electric200Есть у меня PHP скрипт который запускается при подключении к сокету (порту) удаленным устройством.Опишите подробнее, как это происходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2012, 22:24 |
|
||
|
[PHP] управление процессами
|
|||
|---|---|---|---|
|
#18+
Возможно действительно со стороны сложновато. В общем в двух словах. 1. Некое устройство подключается к серверу по 10003 порту. 2. Некий демон на сервере мониторит внешние подключения. 3. При появлении подключения, передает дескриптор сокета (соединения) моему скрипту в потоке STDIN 4. Мой скрипт начинает побайтово получать данные. Получает именно побайтово до формирования условной посылки. 5. Скрипт ожидает получения всей условной пысылки, к примеру 12 байт. В случае если передалось только 8 байт, скрипт ожидает остальные байты. По сути, задача установится макс. время для этого ожидания. Что бы скрипт не висел в процессе сервера и не дай бог ушел в зомби. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2012, 12:20 |
|
||
|
[PHP] управление процессами
|
|||
|---|---|---|---|
|
#18+
Electric200, set_time_limit ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2012, 15:09 |
|
||
|
[PHP] управление процессами
|
|||
|---|---|---|---|
|
#18+
set_time_limit - будет останавливать скрипт в любом случае. А мне нежно, в случае отсутствия потока данных. Вот сейчас смотрю в сторону stream_ set_ timeout() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2012, 16:20 |
|
||
|
[PHP] управление процессами
|
|||
|---|---|---|---|
|
#18+
stream_ set_ timeout() не работает с SDTIN .. поиск продолжается.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.01.2012, 17:21 |
|
||
|
[PHP] управление процессами
|
|||
|---|---|---|---|
|
#18+
Electric200, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.01.2012, 23:31 |
|
||
|
[PHP] управление процессами
|
|||
|---|---|---|---|
|
#18+
an0nym - спасибо за stream_select(); То что доктор приписал!) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2012, 12:59 |
|
||
|
[PHP] управление процессами
|
|||
|---|---|---|---|
|
#18+
Задача у меня похожая, но возникла проблемка - необходимо запускать некий скрипт (питоновский), читать из него вывод и отправлять этот вывод подключающимся через websocket клиентам по мере появления данных. Всё это реализовал, работает нормально, но вывод отправляется только тогда, когда скрипт отрабатывает до конца, а не по мере появления данных. Что делаю не так? Вот кусок кода: Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2015, 15:13 |
|
||
|
[PHP] управление процессами
|
|||
|---|---|---|---|
|
#18+
Закомментировал proc_open и работу с его потоками, поставил вывод фиктивных данных: Код: php 1. 2. 3. 4. 5. и стало всё работать, как и задумывалось. То есть proc_open или fgets мне блокирует весь вывод к клиентам. Как их пришаманить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2015, 11:13 |
|
||
|
[PHP] управление процессами
|
|||
|---|---|---|---|
|
#18+
Разобрался, но без 0.5 литра не обошлось! %) Я пытался через proc_open запускать питоновские скрипты, а питон, по умолчанию, делает буферизацию перед выводом в консоль((( Сволочи. Случайно на это наткнулся, когда попробовал запустить башевский скрипт и он у меня отработал, как следовало. Теперь и питон заработал с опцией -u. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2015, 16:31 |
|
||
|
[PHP] управление процессами
|
|||
|---|---|---|---|
|
#18+
antoshib, Ну так не только питон. PHP делает также. И для этого предусмотрены функции отключения/включения/очистки буфера. Я смотрел ваш пример, и по PHP примеру не увидел использование буфера. Ну а что там в питоне, не видно отсюда. Вообще использовать нативную работу с сокетами в PHP не очень хорошая идея. Идея с форками еще напомнит вам о себе в будущем с не очень хорошей стороны. По этому советую посмотреть в сторону NodeJS для работы с сокетами, или если уж там нужно PHP, то Swoole . Но очень советую бросить затею с форками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2015, 22:03 |
|
||
|
[PHP] управление процессами
|
|||
|---|---|---|---|
|
#18+
Electric200an0nym - спасибо за stream_select(); То что доктор приписал!) интересно, как ему селект помог, если у него проблема выставить таймаут, ну или уйти от блокировки при ожидании данных. есчё более не понятно, пока эдин принимает данные на порту 10003, ведь никто другой на этот порт не подключиться! и упорное использование интеграция вместо итерация... мдя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2015, 05:25 |
|
||
|
[PHP] управление процессами
|
|||
|---|---|---|---|
|
#18+
alex564657498765453Electric200an0nym - спасибо за stream_select(); То что доктор приписал!) интересно, как ему селект помог, если у него проблема выставить таймаут, ну или уйти от блокировки при ожидании данных. есчё более не понятно, пока эдин принимает данные на порту 10003, ведь никто другой на этот порт не подключиться! и упорное использование интеграция вместо итерация... мдя. Я не знаю о чем ты тут рассказываешь. Уходить от блокировки и не нужно. Устанавливаешь побайтовое чтение stream_get_contents в цикле с установленной проверкой stream_select() на сработку таймаута. Таймаут сработал - завершил скрипт. Сокеты мониторит на наличие входящих подключений inetd и передает поток PHP обработчику, который дальше работает с потоком. Все это происходит асинхронно. Хочешь могу даже пример кода показать если ты такая недоверчивая штучка) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2015, 22:53 |
|
||
|
[PHP] управление процессами
|
|||
|---|---|---|---|
|
#18+
Electric200alex564657498765453пропущено... интересно, как ему селект помог, если у него проблема выставить таймаут, ну или уйти от блокировки при ожидании данных. есчё более не понятно, пока эдин принимает данные на порту 10003, ведь никто другой на этот порт не подключиться! и упорное использование интеграция вместо итерация... мдя. Я не знаю о чем ты тут рассказываешь. Уходить от блокировки и не нужно. Устанавливаешь побайтовое чтение stream_get_contents в цикле с установленной проверкой stream_select() на сработку таймаута. Таймаут сработал - завершил скрипт. Сокеты мониторит на наличие входящих подключений inetd и передает поток PHP обработчику, который дальше работает с потоком. Все это происходит асинхронно. Хочешь могу даже пример кода показать если ты такая недоверчивая штучка) покажи. а то мож я действительно не понимаю чегото... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2015, 14:05 |
|
||
|
[PHP] управление процессами
|
|||
|---|---|---|---|
|
#18+
alex564657498765453, Код: php 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. Собственно пример выше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2015, 14:25 |
|
||
|
[PHP] управление процессами
|
|||
|---|---|---|---|
|
#18+
Electric200, Вы можете мне помочь разобраться с именованным каналами, я ни разу, до этого, ими не пользовался а мне необходимо соединиться и наладить обмен с вот этим https://yadi.sk/d/37nrmRktqccAV Он отвечает на соединение socket_connect() от клиента, но после попытки отправить сообщение с помощью socket_write() разрывает соединение, при эта утилитка в лог пишет, что слишком длинное сообщение. Я не учился на программиста, поэтому слабо понимаю суть процесса, немного плаваю. Основная проблема в том что я не понимаю как необходимо указывать строку для создания pipe ресурса, и в какой момент времени. Если вам не сложно вы не могли бы помочь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2016, 16:23 |
|
||
|
|

start [/forum/topic.php?fid=23&msg=39007388&tid=1461143]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
74ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
| others: | 255ms |
| total: | 436ms |

| 0 / 0 |
