【问题标题】:Trying to get a long running function to run in background using cakephp and bash shell script尝试使用 cakephp 和 bash shell 脚本在后台运行长时间运行的函数
【发布时间】:2012-03-26 15:51:45
【问题描述】:

我在 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,它们在某种程度上有效,但需要特定用户的登录凭据。这样做的原因是它绕过了系统登录,但我无法让它访问任何模型数据。

有人知道我怎样才能让它工作吗?基本上我想做的就是在后台运行这个长函数,同时可以访问 cakephp 模型。

谢谢大家!

【问题讨论】:

  • 你用的是哪个蛋糕版本?

标签: php shell cakephp background


【解决方案1】:

尝试使用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");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2011-08-27
    • 1970-01-01
    • 2013-09-07
    相关资源
    最近更新 更多