Как запускать одну функцию для разных задач одновременно?
Есть функция, которая участвует в генерации страницы, собирает части шаблона в кучу, и проверяет наличие вложенных файлов (Картинок, архивов), по 50 шт за раз. Одна функция выполняет две задачи одновременно, и когда это происходит, может вылететь ошибка - ненайденого файла, части шаблона. Получается, вместо проверки вложения, функция может проверить наличие шаблона, по адресу вложенного файла. Путаница, в общем.
Если генерировать страницу, без проверки вложений, или проверять вложения без генерации страницы, все нормально.
Сейчас я отложил проверку вложений, она начинается только после того, как страница будет сгенерирована и отдана пользователю. Но хотелось бы узнать, как можно разделять несколько задач для одной функции, одновременно?
Для начала надо научиться излагать свои проблемы внятно.
Вам надо пояснить, что это за "вложения", какое отношение они имеют к "собираемой странице" и почему надо все делать одновременно.
Если PHP работает под веб-сервером он выполняется синхронно в один поток, допустим он проверяет вложения и выдает ошибки. Вы отключили эту проверку и ошибок нет. Проверять после отдачи страницы это допустим в конце кода запустить скрипт exec в режиме cli без ожидания ответа - вот собственно вы и разделили, но зачем запускать эту проверку после отдачи страницы да еще и каждый раз и без получения результата - это хороший вопрос.
Можно проверять синхронно и не выдавать ошибки. Вообщем не понятно - что и для чего делается. Еще можно послать аякс после загрузки и получить результат проверки.
Проверка вложений проходит периодически, те, что "свое отжили" удаляются. Проверка запускается по Крону. Крон использую движка, за счет посещений пользователей или ботов. Вот и получается, что пользователь, кроме генерации страницы запускает еще и проверку вложений, и обе задачи выполняются одновременно.
PHP работает под Веб сервером. Да.
С Вашего ответа я понял, что моя проблема, это скорей особенность PHP на Веб сервере.
// Еще можно послать аякс после загрузки и получить результат проверки.
Именно к такому решению я и пришел вчера... Ни чего лучше я не придумал... Думал использовать pcntl_fork, но не понял, как ее применить в моем случае, да и Ajax запрос мне показался вариантом в разы лучше.
Slash, проверка запускается либо по крону либо пользователями сайтов (что неразумно). Проверяйте по крону и удаляйте вложения. А когда отдается страница проверок не нужно, лишь правильно генерировать страницу, не выводя ошибок, для этого надо убрать предупреждения php и возможно поправить код который выводит html.
Slash, вариант который запускает пользователь сайта, но не при каждом посещении (крон имеется ввиду синхронизация со временем) вариант в принципе рабочий (если других нет) Если все так плохо, тут пользователь удаляет только свои вложения или все ? Если все нужен бот хоть по обычному крону, но http запрос к сайту по url. Если только свои вложения надо править код, просто не выводить никакие ошибки или все-таки аякс. В любом случае это велосипед, но что поделать.
// проверка запускается либо по крону либо пользователями сайтов (что неразумно)
Крон запускается за счет посещения. А Крон уже выполняет всю работу. Тут выходит, что запускает выполнение всех задач Крона пользователь, и собственно пользователь может и получить ошибку.
// А когда отдается страница проверок не нужно, лишь правильно генерировать страницу, не выводя ошибок
Да, к этому я и стремился. Ajax решил эту проблему.
// пользователь удаляет только свои вложения или все ?
Все. Сценарий пробегает по одной папке вложений, и проверяет их. Не важно, кому эти файлы принадлежат.
// В любом случае это велосипед, но что поделать.
Согласен с Вами!
Все. Сценарий пробегает по одной папке вложений, и проверяет их. Не важно, кому эти файлы принадлежат.
Тогда нужен бот, если это работает через движок. Но нужно как-то отфильтровать, чтобы другие посетители не запускали сценарий не грузили сервер. Может по секретному ключу в get-параметре или ip-адресу.
// Но нужно как-то отфильтровать, чтобы другие посетители не запускали сценарий не грузили сервер.
Я не уточнил: Крон выполняется раз в минуту. Если он уже выполнился, то в течении минуты его ни кто не запустит.
Судя по описанию задачи, у вас 2 независимых действия почемуто влияют друг на друга, вызывая ошибки при параллельном выполнении. Если так, то вопрос не в том, как их запускать, а почему они зависимы, и решать надо эту проблему.
// Расскажите, подробней, это как?
Есть список задач (Таблица), что должен выполнять Крон. В талице указано время последнего выполнения, время следующего, период выполнения и сама задача. Активные задачи сохраняются в кэше сайта в виде массива, в файле. При посещении сайта, проверяется данный файл, а именно "поле" - время следующего выполнения, если оно равно текущему или текущее больше, то выполняется задача, чье время подошло.
После выполнения, меняется время последнего выполнения, и время следующего выполнения (Исходя из расчета установленного периода и последнего выполнения).