假设您正在编写一个为作业队列提供服务的守护进程.各种其他软件将守护程序的作业写入队列.守护程序每隔几秒轮询队列以查找挂起的作业.假设队列是作为MySQL数据库中的表实现的,并且守护进程是一个简单的循环:
守护程序必须经受MySQL数据库服务器的中断服务和数据库连接中断.
您是否会将守护进程设计为每个周期连接一次数据库服务器?即在1.之前连接并在2和3之间断开连接?
或者你有守护进程保持连接打开?在这种情况下,它还需要a)检测服务器或连接何时不工作,b)断开连接和重新连接,以及c)这样做而不累积数据库连接,哑连接描述符或其他死资源.
如果您有偏好,为什么?
优点和缺点?
进入设计的因素?
还有其他方法吗?
答案在这里:用PHP编写的守护进程的mysql连接并没有说为什么最好保持连接打开.我在别处读到MySQL中的每个连接开销非常轻.因此,为什么永久消耗一个服务器连接比每隔几秒连接/断开更好是不明显的.
在我的例子中,守护进程是用PHP编写的.
假设存在两个脚本Requester.php和Provider.php,并且Requester需要从Provider处理并向其发出http请求(Provider.php?data ="data").在这种情况下,Provider快速找到答案,但维护系统必须在整个数据库中执行各种更新.有没有办法立即将值返回给Requester,然后继续在Provider中处理.
Psuedo Code
Provider.php
{
$answer = getAnswer($_GET['data']);
echo $answer;
//SIGNAL TO REQUESTER THAT WE ARE FINISHED
processDBUpdates();
return;
}
Run Code Online (Sandbox Code Playgroud) 我想用ffmpeg在php中将视频转换为.flv.目前我有这个工作,但它挂起浏览器,直到文件上传并完成.我一直在查看关于如何在后台运行exec()进程的php文档,同时使用返回的PID更新进程.这是我发现的:
//Run linux command in background and return the PID created by the OS
function run_in_background($Command, $Priority = 0)
{
if($Priority)
$PID = shell_exec("nohup nice -n $Priority $Command > /dev/null & echo $!");
else
$PID = shell_exec("nohup $Command > /dev/null & echo $!");
return($PID);
}
Run Code Online (Sandbox Code Playgroud)
还有一个技巧,我用它来跟踪后台任务是否正在使用返回的PID运行:
//Verifies if a process is running in linux
function is_process_running($PID)
{
exec("ps $PID", $ProcessState);
return(count($ProcessState) >= 2);
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个单独的.php文件,然后从php cli运行以执行其中一个函数?我只需要稍微轻推一下,然后我可以从那里拿走它.
谢谢!
我有一个PHP Web应用程序需要调用C++库中的函数.该库由供应商(Linux机器上的libfoo.a)提供.
我的第一直觉是创建一个链接libfoo.a的C++可执行文件,并将命令行参数传递给该函数.然后,PHP Web应用程序可以对我的c ++可执行文件执行system()调用.这很容易实现.我担心的是它是否会增加很多开销来为每个调用创建一个新的系统进程.这个开销会是多少?
另一种方法是我可以使用SWIG将C++函数包装在PHP扩展中,但我没有C++源代码.SWIG是否支持与".a"库链接?是否需要我团队中的其他工程师更改其PHP配置以构建libfoo.a?
如果system()调用的开销很小(<30 ms),我更喜欢选项#1,因为创建一次C++可执行文件似乎要简单得多,而不是将它构建到PHP应用程序中.您对这两个选项有何建议?
这不是我第一次从我的托管中收到太多的CPU加载警告.代码只是一些带有mysql查询的随机php脚本,没什么特别的.(表格不是特别的,最多几百行,如果要求,我总是限制它们.
我不介意它运行0.15秒而不是0.05,所以有没有办法控制进程优先级或限制CPU负载?
谢谢!
我有一个问题,我在页面加载时调用 PHP 函数 - 该函数检查文件是否存在,它返回文件名,如果它不存在,它运行一个相当足智多谋且需要时间的脚本 - 转换波形图像从音频文件。问题是音频文件很大,所以创建文件可能需要一些时间,所以如果音频文件没有与之关联的图像文件,页面加载所需的时间与进程一样长。
我想要的是让这个函数返回一个不存在的占位符图像,但在页面加载后继续这个过程 - 或者在后台。所以理论上当页面在以后重新加载时,正确的图像就会出现。
我目前可以获得占位符图像的返回,但随后该过程停止并且图像不会生成。这是我到目前为止所拥有的:
function example($file_path, $file_name) {if ($file_path) {
if (file_exists("/path/to/folder/{$file_name}.png")) {
return "/path/to/folder/{$file_name}.png";
}
if (!file_exists("/path/to/folder/{$audio_file_name}.png")) {
return "/path/to/folder/processing.png";
Some stuff in here
return $new image
} return FALSE
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,当文件不存在时,这只会停止,但我希望这里的内容在后台继续。有可能还是我需要不同的方法?像 cron 工作之类的?任何帮助表示赞赏。
我需要执行一个shell脚本.抓住我想做到这一点
$Command = "nohup cvlc input --sout '#transcode {vcodec=h264,acodec=mp3,samplerate=44100}:std{access=http,mux=ffmpeg{mux=flv},dst=0.0.0.0:8083/".output"}' &";
$str = shell_exec($Command);
Run Code Online (Sandbox Code Playgroud)
我不希望它等到命令完成,我希望它在后台进程中运行.我不想要另一个php线程因为它会超时命令最多可能需要3个小时才能完成.
我有这个PHP脚本,需要一点时间来处理.但是我不希望查看器等待脚本完成.我希望他能够继续浏览和/或关闭浏览器.但我希望脚本继续工作......我怎么能这样做?有没有办法创建某种允许这样的东西的线程?
ps我真的不想用另一种语言重写脚本并通过os执行它.
我想从PHP脚本中触发eider exec()或system()中的shell命令,但这是一个需要一段时间才能完成的任务,有没有办法触发它并继续运行PHP页面加载而没有延迟?
编辑:我在CentOS 6,PHP 5.3上
我有以下执行完美但不在后台应该执行?它实际上会停止页面加载,直到它完成,这是不好的.
shell_exec("/usr/bin/php /home/public_html/pages/test/backg.php {$user_info} {$user_info2} {$user_info3} &");
Run Code Online (Sandbox Code Playgroud)
我也试过了
exec("/usr/bin/php /home/public_html/pages/test/backg.php {$user_info} {$user_info2} {$user_info3} &");
Run Code Online (Sandbox Code Playgroud)
我以为
&
意味着它会执行然后让持有页面继续吗?