我在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模型。
谢谢大家!
答案 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");