Я, вероятно, создал бы адаптер типа для преобразования булевской переменной к интервалу существуют [приблизительно 110] примеры в пользовательском руководстве JAXB.
Функции curl_multi_xyz (), такие как curl_multi_exec ()
, позволяют обрабатывать несколько запросов одновременно. Также посмотрите CURLOPT_RANGE
, если вы хотите загружать несколько сегментов одного и того же файла параллельно.
А функции обратного вызова, которые вы можете установить с помощью CURLOPT_READFUNCTION
и CURLOPT_WRITEFUNCTION
, позволили бы вам отправлять некоторые данные о ходе выполнения клиенту.
Ко всем критикам «PHP не подходит для многозадачности»:
Сделайте шаг назад и подумайте, что в вашем распоряжении есть потрясающая структура многопоточности, если вы в среда LAMP. Используйте эту базовую архитектуру в своих интересах, т. Е. Apache является менеджером многопоточности, и в этом он чертовски хорош.
Настроить PHP для работы в этой среде очень просто.
- Задайте max_execution_time = 0, чтобы разрешить выполнение сценариев неограниченно.
- Установите ignore_user_abort = true, чтобы разрешить выполнение сценариев даже после клиент прервал
Разработка легких однозадачных веб-служб REST. Спроектируйте их таким образом, чтобы вам было все равно, когда они возвращаются, например, в системе типа очереди. Запись в очередь является потокобезопасной, а удаление из очереди - потокобезопасным, если выполняется с помощью некоторых основных мьютексов на уровне ОС.
«разветвление» веб-служб так же просто, как открытие файла:
fclose (fopen ("http: //somewebservice....php? a1 = v1 & a2 = v2 & ....")); // Запускаем веб-службу и продолжаем ...
Этот подход не только многопоточен, но и распределен по своей сути. Веб-сервис может быть локальным или расположен по всему миру. PHP определенно не заботится.
Для базовой системы единственное, что вас сдерживает, - это количество потоков, которое позволяет apache. В противном случае ваш код готов воспользоваться преимуществами балансировки нагрузки и всеми другими изящными уловками, которые могут предложить продвинутые реализации Apache.
Слишком часто, когда разработчик думает «многопоточным», он думает: «Боже мой, мне нужно обрабатывать вилки и исполнители. и ждет и PID ». И если вы так спроектируете свою систему - вы правы, она очень быстро усложняется. Сделайте шаг назад и используйте то, что дано. У вас есть доступ к каталогам? Бум - у вас очереди. Вы можете звонить через Интернет? Бум - у вас есть многопоточное (распределенное) приложение. Теперь просто объедините концепции вместе, как диктует ваше приложение.
PHP не является многопоточным, и, если вы попытаетесь принудительно использовать его как таковой с помощью нескольких файловых вызовов или разветвления, результаты обычно неоптимальны. Я бы посоветовал против этого, ОДНАКО, можно было бы сделать что-то подобное с помощью сочетания js, php (вероятно, не curl, но пользовательского потока файлов php ) и long polling