Как работает php?
Поясняю что мне хочется узнать, я всегда думал что это происходит примерно так:
зашло на сайт 1000 человек, на сервере для каждого юзера выполнился скрипт сразу. (Без очередей, и ожидание, пока у одного загрузится, потом у второго, третьего и так до 1000, Последний уже седой сидит и бабку толкает в бок, что вот-вот загрузится.)
Если это так, то мне не ясна работа Телеграм бота, который я пытаюсь написать.
1 часть бота - это говорилка.
2 часть бота - это отправку CURL на сайт и парсинг с него данных и отправка обратно в виде скриншота.
Сначала я выполнял вызов CURL из тела бота, что меня удивило, что клиенты стоят в очереди, пока у одного загрузится, потом у второго, так я подумал, проблема не в PHP, а в опросе сервера со стороны Телеграм.
Изменил алгоритм, вызываю, короткий curl с GET запросом в сторонний мой файл, а из него уже делаю тот самый запрос, который был изначально, тем самым, "убиваю очередь", на каждый запрос идет пару мл.
Хотя сразу скажу запрос долгий примерно 40 сек. (и это вина стороннего сайта, так он и работает без моих запросов)
Сижу я значит довольный, что все получилось, пока не приходит мысль, проверить, а что будет если запустить у нескольких юзеров одновременно запрос.
И тут начинается проблема, как я понял запрос идет на один файл, и эти запросы перекликаются, и они то постят одну и ту же картинку, то не доходят до отправки скрина. Хотя в имени сохранения картинки, я ставлю время с начало люнекс, чат_id, и еще личные цыфры отправляемые в GET запросе, т.е. одинаковых имен в природе не может получиться.
Хотя CURL это же имитация браузера, и по идее разные запросы.
Следовательно, PHP обрабатывает запросы не в разных потоках.
Тогда, как со стороны браузера 1000 клиентов не ждут друг друга.
Нужен пример с кодом. Для сервера нет разницы приходит запрос из браузера или из curl.
Если ваш "бот" однопоточный, например в цикле считывает историю сообщений и поочередно выполняет действия то очевидно что пока он 40 секунд выполняет одну задачу то к следующей не перейдет.
Дай файла:
1. файл (Говорилка) - Например /привет - Бот ага отвечаю привет. и т.д, потом юзер а дай мне инфу по номеру 100000.
1. Файл ок, ждите. и отправляет POST запрос по CURL во второй файл с жизнью CURL 400 млс.
Это не убиваю, это "падает с таймаутом в пол секунды, не дождавшись ответа сервера". Как бы не совсем то же самое.
Ок, так и в итоге, в чем проблема? Второй скрипт по 40 секунд возвращает ответ в тг, причем не обязательно в том порядке что вы отправили запросы?
Проблема в том, что он перекликает запросы, т.е.
Одновременно:
1. юзер дал задание спостить инфу под номером 1
2. юзер дал задание спостить инфу под номером 2
4е Варианта исхода событий:
1 юзеру приходит то что он запросил, второму приходит то что он запросил
1 юзеру приходит то что он запросил, второму приходит то что запросил 1 (хотя скрины сохраняются локально, имена разные но инфа в них одна и та же
1 юзеру приходит то что он запросил, второму приходит скрин с пустой инфой
1 юзеру приходит то что он запросил, второму ничего.
nyqpblcTuk, уберите принудительный разрыв соединения после 400 мсек. Негоже так делать, лучше дождаться результата выполнения скрипта 200 OK. А то вдруг у пользователя медленный Интернет, а у вас на сервере перегруз тяжёлыми запросами, а тут ещё и разрыв соединения - по умолчанию при разрыве соединения PHP убивает скрипт, запущенный разорванным соединением.
Ну судя по работе с API ТГ - да.
в API ТГ - установить вебхук к исполняемому файлу.
Устанавливаем ВЕБХУК, после этого файл всегда в ожидании запроса от ТГ.
ТГ шлет вам каждый раз запрос, когда есть обновлении в чате.
Файл на сервере всегда в ожидании чего либо, и запросы от ТГ выстраиваются в очередь.
Получается всего один поток.
Я уже думаю уйти от php в сторону питона.
Но необходимо будет учить язык.
По-поводу процессов в PHP-FPM есть вводное видео.
Рекомендую ознакомится.
В вашем случае, и везде где нужно сохранять порядок, используется очередь Пример очереди
Суть очереди в том, что вы используете базу данных, для сохранения каждого запроса, а воркер ищет добавленные в очередь (записи в бд) задачи и выполняет их по принципу FIFO.
За многозадачность отвечает тот кто собственно запускает php, например веб сервер, в его настройках указывается, сколько потоков должно быть запущено одновременно, при превышении это количества клиенты ждут.
Если веб сервером работает само php приложение, то все зависит от ее реализации, обычно все используют однопоточный подход с асинхронными методами и очередью (например reactphp), т.е. если все методы в таком приложении будут асинхронные (по сути они не исполняют задачу а запускают процесс параллельно и как то указывается способ реакции на логику и подписание результата, например коллбеки), но как только в таком приложении запускается не асинхронный метод, весь процесс притормаживается, даже бывает другие асинхронные задачи, и получается что все другие запросы встают в очередь.