尝试使用cakephp和bash shell脚本在后台运行一个长时间运行的函数

时间:2012-03-26 15:51:45

标签: php shell cakephp background

我在cakephp的控制器中有一个函数可能会运行数千秒。该函数基本上有一个链接列表,并联系几个API,以从中获取各种SEO数据。因此每个链接每个可能需要几秒钟。

我一直试图为我做一个蛋糕壳,但没有运气。我最接近的是拥有这个bash脚本,它运行带有参数的必需shell(在这种情况下为30,这是系统上用户的id。)

/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");

现在,如果我ssh到我的服务器并直接从那里运行它,bash脚本就可以工作了。所有链接都正确更新,一切都很好。从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

在我达到这一点之前,我尝试使用wget和会话cookie,这些cookie在某种程度上起作用,但需要特定的用户登录凭据。这是因为它绕过了系统登录,但我无法访问任何模型数据。

有谁知道如何让这个工作?基本上我想做的就是在后台运行这个长功能,同时可以访问cakephp模型。

谢谢大家!

1 个答案:

答案 0 :(得分:0)

尝试使用updateN.txt文件的绝对路径。 Web服务器作为非特权用户运行,因此您可能在尝试写入默认工作路径时遇到问题。

Shell脚本:

#!/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");