Попытка заставить долго выполняющуюся функцию запускаться в фоновом режиме, используя скрипт оболочки cakephp и bash - PullRequest
1 голос
/ 26 марта 2012

У меня есть функция в контроллере в CakePHP, которая потенциально может работать в течение тысяч секунд.Функция в основном имеет список ссылок и контактов нескольких API, чтобы получать от них различные SEO-данные.Таким образом, каждая ссылка может занять несколько секунд каждая.

Я пытался настроить раковину торта, чтобы сделать это для меня, но безуспешно.Самое близкое к этому, что у меня есть этот bash-скрипт, который запускает требуемую оболочку с параметром (в данном случае 30, который является идентификатором пользователя в системе).

/home/linkmoni/public_html/cake/console/cake -app /home/linkmoni/public_html/app updateuserlinks 30 > update3.txt 2> update3.err &

, а затем вызываем этот скрипт изв моем контроллере

$result = exec("sh update_links.sh > update2.txt 2> update2.txt");

Теперь скрипт bash работает, если я запускаю ssh на свой сервер и запускаю его прямо оттуда.Все ссылки обновляются правильно и все в порядке.При запуске из php exec, кажется, проблема.Насколько я могу судить, это связано с требованием входа пользователя в систему.

После выполнения приведенного выше кода единственный текст находится в update3.txt

Status: 302 Moved Temporarily
X-Powered-By: PHP/5.2.17
P3P: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
Location: http://linkmoni.com/~linkmoni/links
Content-type: text/html

ПередЯ дошел до того, что попытался возиться с файлами cookie wget и session, которые в некоторой степени работали, но требовали учетные данные для входа определенных пользователей.Это сработало в том, что обошло вход в систему, но я не смог получить доступ к данным любой модели.

Кто-нибудь знает, как я могу заставить это работать?В основном, все, что я хочу сделать, это запустить эту длинную функцию в фоновом режиме, имея при этом доступ к моделям CakePHP.

Спасибо всем!

1 Ответ

0 голосов
/ 26 марта 2012

Попробуйте использовать абсолютный путь к вашим updateN.txt файлам. Веб-сервер работает как непривилегированный пользователь, поэтому у вас может возникнуть проблема при попытке записи в рабочий путь по умолчанию.

Сценарий оболочки:

#!/bin/sh
USER_ID=$1
WEB_ROOT=/home/linkmoni/public_html
CAKE=${WEB_ROOT}/cake/console/cake
WORK_PATH=/tmp/linkmoni/updateuserlinks
OUTFILE=${WORK_PATH}/update-${USER_ID}.txt
ERRFILE=${WORK_PATH}/update-${USER_ID}.err

mkdir -p ${WORK_PATH}

${CAKE} -app ${WEB_ROOT}/app updateuserlinks ${USER_ID} \
   > ${OUTFILE} 2> ${ERRFILE} &

В вашем приложении:

$result = exec("sh /path/to/update_links.sh > /tmp/linkmoni/update2.txt 2>&1");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...