Как запустить php скрипт
Перейти к содержимому

Как запустить php скрипт

  • автор:

Как запустить php скрипт

портфолио

Запуск PHP скриптов в фоновом режиме

Когда проект растет, появляются ресурсоемкие задачи обработки данных. Например, разбор xlsx (эксель) прайса для обновления цен, или ресайз большой фотографии. Случаи могут быть самыми разнообразными, когда мы не хотим, чтобы пользователь ждал, пока наш скрипт отработает.

В данном посте расскажу, как можно запускать фоновое выполнение PHP скриптов. Следует отметить, что без использования VPS (Virtual Private Server), то есть на обычном шаред хостинге, такой способ не сработает. Строго говоря, диспетчер создавался под Linux, хотя не исключена корректная работа и на FreeBSD. Даже скорее всего будет работать тоже.

В самом диспетчере ничего сложного нет, он скорее имеет больше заморочек по администрированию. Давайте сначала разберем, из чего он состоит со стороны ОС, какие используются команды:

ps -C php -o pid=,command=

Здесь мы запрашиваем список процессов с именем php. Остальные параметры влияют на отображение результатов, т.е. мы хотим видеть pid, и непосредственно полную команду, включая параметры. Пример вывода этой команды:

12769 php /path/to/1.php /path/to/price.xlsx

Таким образом, мы проверяем, запущена ли уже такая задача, и если запущена, то по умолчанию повторный запуск не производится. Если все же требуется параллельно запустить еще один экземпляр с точно такими же параметрами, можно это указать явным способом.

php -d max_execution_time=300 –f /pathto/1.php /pathto/price.xlsx > /dev/null 2>&1 & echo $!

Здесь мы запускаем php, причем указываем максимальное время выполнения в 300 секунд, чтобы наши фоновые процессы не превратились в бесконечные. Простая мера предосторожности, не более. Далее идет путь к скрипту, потом параметры, если есть необходимость. Перенаправляем вывод вместо stdout в «черную дыру», 2>&1 означает, что мы так же направляем вывод ошибок туда же. Кстати, можно перенаправить в файл через >>, в целях дебаггинга. Но советую отлаживать скрипты перед тем как их щапускать в фоне. Самое главное, последняя часть: & уходим в background и echo $! Как раз выводим (возвращаем) PID только что созданного процесса.

Это все, теперь сам код диспетчера и пример использования:

class backgrounder < public function launch($path = null, $timeout = 300, $once = true) < if (! file_exists(preg_replace('/^(\S+).*/', '$1', $path))) < throw new Exception('No such file to launch'); >if ($once === true) < exec('ps -C php -o pid=,command=', $output); foreach ($output as $row) < preg_match('/-f (.*)/', $row, $result); if (!empty($result[1]) && $result[1] == $path) < return false; >> > return exec('php -d max_execution_time=' . $timeout . ' -f ' . $path . ' > /dev/null 2>&1 & echo $!', $output); > public function isRunning($pid) < exec('ps -p ' . $pid . ' -o command=', $output); if (empty($output)) < return false; >if (preg_match('/php -d max_execution_time=/', $output[0])) < return true; >return false; > >

Допустим у нас есть php скрипт, который принимает в параметрах путь до файла, читает его и складывает содержимое в другой файл. Причем делает это очень долго (заменим на sleep �� )

//copyman.php //В массиве $argv все переданные параметры вызова if (empty($argv[1])) < exit(); >sleep(30); $content = file_get_contents($argv[1]); file_put_contents('ourfile.txt', $content);

А вот, как запускать его в фоновом режиме:

//index.php require_once 'backgrounder.php'; $bg = new backgrounder(); $pid = $bg->launch(__DIR__ . '/copyman.php exampledata.txt'); echo $pid;

Метод launch может принимать 3 параметра. Первый это путь к файлу-скрипту со всеми параметрами; второй – максимальное время выполнения (по умолчанию 300 секунд) и третий разрешено ли запускать копии, то есть точно такие же процессы с идентичными параметрами.

Обратите внимание, в переменную $pid мы вернули идентификатор процесса. Его можно где-нибудь сохранить, например, в куках пользователя, и при следующем открытии страницы узнать, закончилось ли выполнение задачи. Для этого метод isRunning

В ответ true или false соответственно.

root4root aka admin

CRON – запуск php скрипта по расписанию

CRON – запуск php скрипта по расписанию

В панели управления ISPManager в разделе«Инструменты» — «Планировщик (cron)»добавьте задание (выберите Период, Минуты, Часы, Дни ..):

/usr/bin/wget -O /dev/null «http://ваш_домен/путь_к_вашему_скрипту»
(пример: /usr/bin/wget -O /dev/null «https://abcname.net/cron/cron.php»)

wget -q -O — https://abcname.net/tpl/templates_importonec/ >/dev/null 2>&1

/usr/bin/php /var/www/ваш_логин/data/www/имя_домена/путь_файлу
(пример: /usr/bin/php /var/www/superuser/data/www/abcname.net /cron/cron.php)

php скрипт как сервис

Когда вы первый раз заходите с помощью соцсетей, мы получаем публичную информацию из вашей учетной записи, предоставляемой провайдером услуги соцсети в рамках ваших настроек конфиденциальности. Мы также автоматически получаем ваш e-mail адрес для создания вашей учетной записи на нашем веб сайте. Когда она будет создана, вы будете авторизованы под этой учетной записью.

Не согласен Согласен
Войти через D
Я разрешаю создать мне учетную запись

Когда вы первый раз заходите с помощью соцсетей, мы получаем публичную информацию из вашей учетной записи, предоставляемой провайдером услуги соцсети в рамках ваших настроек конфиденциальности. Мы также автоматически получаем ваш e-mail адрес для создания вашей учетной записи на нашем веб сайте. Когда она будет создана, вы будете авторизованы под этой учетной записью.

Не согласен Согласен
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
Загрузить ещё комментарии

Поиск по сайту
Основные темы
Разделы
  • Unix’oid (138)
  • Virtual (10)
  • Window’er (45)
  • Железки (27)
  • Информация к размышлению (25)
  • Практика (138)
  • Работа над ошибками (48)
QR-код статьи
Правила

• Можно цитировать два или три абзаца статьи, которая понравилась без разрешения. Прямая ссылка на источник обязательна. Не воруйте. Тупой копипаст понижает Ваш сайт в поисковой выдаче

Отказ от ответственности

• Все материалы предоставляются по принципу AS-IS для ознакомления. Вы можете их использовать для решения своих задач. Это Ваш выбор. Думайте над каждой строкой, которую применяете. Ответственность за ущерб несете только Вы

Донат админу

• Нашли полезный совет? Сохранили Ваши нервы? Тогда справедливо будет в знак благодарности, немного задонатить админу. Заранее благодарен

Как запустить php скрипт

Покинул форум
Сообщений всего: 55
Дата рег-ции: Апр. 2009

Помог: 0 раз(а)

У меня такой вопрос. Можно ли реализовать это с помощью PHP.

Нужно чтобы автоматически раз в месяц в определенное время, запускался скрипт, который будет делать выборку из БД.
Результат сохранять в файл.
Затем формировать письмо и отправлять с вложенным файлом на указанный email.

Скрипт с запросом я напишу.
Функцию с формированием письма с вложенным файлом думаю сделаю.

Как сделать, так чтобы – этот скрипт запускался автоматически в указанное время.

Заранее спасибо за советы.

Отправлено: 16 Декабря, 2009 — 13:47:18

Здесь могла бы быть ваша реклама

Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006
Откуда: Israel

Помог: 3 раз(а)

google / wikipedia -> cron
Отправлено: 16 Декабря, 2009 — 13:56:44

Покинул форум
Сообщений всего: 55
Дата рег-ции: Апр. 2009

Помог: 0 раз(а)

Я понимаю, что нужно с помощью крона задать время запуска.
Прошу прощения, но ничего подобного для автозапуска не делал еще.

К примеру. Есть скрипт php.script:

CODE (text):
скопировать код в буфер обмена

Я делаю его запускающимся:

chmod u+x php.script

пробую запустить и получаю ошибку:

    ./php.script
    ./php.script: line 1: ?php: Нет такого файла или каталога test
    ./php.script: line 3: syntax error near unexpected token `newline’
    ./php.script: line 3: `?>’

Отправлено: 16 Декабря, 2009 — 15:05:43

Покинул форум
Сообщений всего: 214
Дата рег-ции: Дек. 2009
Откуда: Блага

Помог: 0 раз(а)

то что тебя интересует называется планировщиком. Большинство провайдеров предоставляет такие возможности и как правило они уже включены в твой тариф оплаты хостинга. Для этого дело предоставляется интуитивно понятный интерфейс. Уточняй у хостеров.
что касается реализации всего этого средствами php — конечно можно, но тут очень много подводных камней:
1. запуск скрипта зависит от обращения к нему, т.е. кто то должен к нему обратиться (зайти на сайт например)
2.невозможность точного прогноза посещаемости твоего ресурса обеспечит тебе следующее:
3.черезмерная нагрузка на сервер 9если вдруг произойдет резкий всплеск посещаемости))))))
4. или вообще невыполнение задачи в нужное время т.к. за может ни кто и не обратиться к скрипту за нужный интервал времени

в общим самое рациональное решение — это планировщики, а php сгодится на крайний случай, если сильно надо а другого выхода нет.
(Добавление)
dembi
еще вот вопрос:
будь я этим скриптом я бы нифига не понял, меня «будит» сервер с просьбой показать строку «test».. и кому я должен ее показывать?? где выводить?? это ведь не пользователь меня попросил, ..

хотя я могу конечно ошибаться))))

Отправлено: 16 Декабря, 2009 — 16:22:40

Покинул форум
Сообщений всего: 55
Дата рег-ции: Апр. 2009

Помог: 0 раз(а)

Это я для примера написал этот скрапт.

Я хочу понять, php скрипты можно запускать только когда идет какой-то http запрос, или можно писать php срикты, как например sh/bash/python ?

Если можно, то как их запускать из командной строки?

Отправлено: 16 Декабря, 2009 — 17:18:34

Покинул форум
Сообщений всего: 214
Дата рег-ции: Дек. 2009
Откуда: Блага

Помог: 0 раз(а)

dembi
к скрипту может обращаться сервер без твоего участия при помощи планировщиков. просто пример который ты привел содержит команду echo? которая служит именно для вывода строки именно в браузер, а это уже предполагает какой то запрос какого то пользователя какого то браузера. как то так вот.

Отправлено: 16 Декабря, 2009 — 17:25:16

Покинул форум
Сообщений всего: 55
Дата рег-ции: Апр. 2009

Помог: 0 раз(а)

Хорошо, можно привети простой пример.

К примеру вывести с помощью PHP в обысный stdout 2+2

Машина у меня работает под ОС: Debian

Отправлено: 16 Декабря, 2009 — 17:29:44

Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009
Откуда: Россия, Санкт-Петербург

Помог: 617 раз(а)

dembi, если нет, ставите пакет php5-cli
запускать командой: php скрипт
Исполняемым скрипт делать не нужно, запускает всё равно не баш/шелл

Либо — wget’ом запрашиваете по http.

(Отредактировано автором: 16 Декабря, 2009 — 17:31:52)

Отправлено: 17 Декабря, 2009 — 11:37:22

Покинул форум
Сообщений всего: 55
Дата рег-ции: Апр. 2009

Помог: 0 раз(а)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *