PHP进程同步代码实例,php进程实例
经常遇到这样一种情况,计划任务定时后台执行某个php程序,有时候也需要手动执行,可能多个人都需要执行这个程序,如果任务持续时间非常长,就很容易造成重复执行,所以就开发了下面的类。
作用:在实际代码运行前检查与当前相同操作的进程是否正在运行,高并发运行是可靠的,运行中的进程中途异常中断不会产生任何影响。
构造方法传递pid文件目录的绝对路径,需要自己保证不同进程对应不同pid文件。
/*
* 同一个PHP进程只运行一次,根据进程名字判断是否为排重进程,只能运行于linux,高并发条件下是并发安全的。
*/
class SyncProcess {
private $pidFile;
function __construct($pidFile) {
$this->pidFile = $pidFile;
}
/**
* 非阻塞方式返回进程是否正在运行
*/
function check() {
if (PHP_OS == 'Linux') {
$pidFile = $this->pidFile;
if (!empty($pidFile)) {
$flag = false;
$pidDir = dirname($pidFile);
if (is_dir($pidDir)) {
$flag = true;
}
if ($flag) {
$running = true;
clearstatcache(true, $this->pidFile);
if (!file_exists($this->pidFile))
file_put_contents($this->pidFile, '', LOCK_EX);
$f = fopen($this->pidFile, 'r+');
if (flock($f, LOCK_EX ^ LOCK_NB)) {
$pid = trim(fgets($f));
if (!$this->is_process_running($pid)) {
$running = false;
}
}
if (!$running) {
fseek($f, 0);
ftruncate($f, 0);
fwrite($f, getmypid());
}
flock($f, LOCK_UN);
fclose($f);
return $running;
} else {
debug_print("pid file($pidFile) is invalid", E_USER_WARNING);
}
} else {
debug_print("pid file cant't be empty", E_USER_WARNING);
}
} else {
debug_print(__CLASS__ . ' can only run in Linux', E_USER_WARNING);
return true;
}
}
/**
* 如果正在运行或者发生未知错误返回true,如果没有运行返回false
* @param mixed $pid
*/
private function is_process_running($pid) {
if (is_numeric($pid) && $pid > 0) {
$output = array();
$line = exec("ps -o pid --no-headers -p $pid", $output);
//返回值有空格
$line = trim($line);
if ($line == $pid) {
return true;
} else {
if (empty($output)) {
return false;
} else {
if (php_sapi_name() == 'cli')
$n = "\n";
else
$n = "
";
//到这一步的话应该是出什么问题了
$output = implode($n, $output);
debug_print($output, E_USER_WARNING);
return true;
}
}
}else {
return false;
}
}
}
Demo:
$sync = new SyncProcess(APP_PATH . '/data/pid'.implode('', $this->getRoute()));
if ($sync->check()) {
exit("process is running\n");
}

TheSecretTokeEpingAphp-PowerEdwebSiterUnningSmoothlyShyunderHeavyLoadInVolvOLVOLVOLDEVERSALKEYSTRATICES:1)emplactopCodeCachingWithOpcachingWithOpCacheToreCescriptexecution Time,2)使用atabasequercachingCachingCachingWithRedataBasEndataBaseLeSendataBaseLoad,3)

你应该关心DependencyInjection(DI),因为它能让你的代码更清晰、更易维护。1)DI通过解耦类,使其更模块化,2)提高了测试的便捷性和代码的灵活性,3)使用DI容器可以管理复杂的依赖关系,但要注意性能影响和循环依赖问题,4)最佳实践是依赖于抽象接口,实现松散耦合。

是的,优化papplicationispossibleandessential.1)empartcachingingcachingusedapcutorediucedsatabaseload.2)优化的atabaseswithexing,高效Quereteries,and ConconnectionPooling.3)EnhanceCodeWithBuilt-unctions,避免使用,避免使用ingglobalalairaiables,并避免使用

theKeyStrategiestosiminificallyBoostphpapplicationPermenCeare:1)useOpCodeCachingLikeLikeLikeLikeLikeCacheToreDuceExecutiontime,2)优化AtabaseInteractionswithPreparedStateTemtStatementStatementSandProperIndexing,3)配置

aphpdepentioncontiveContainerIsatoolThatManagesClassDeptions,增强codemodocultion,可验证性和Maintainability.itactsasaceCentralHubForeatingingIndections,因此reducingTightCightTightCoupOulplingIndeSingantInting。

选择DependencyInjection(DI)用于大型应用,ServiceLocator适合小型项目或原型。1)DI通过构造函数注入依赖,提高代码的测试性和模块化。2)ServiceLocator通过中心注册获取服务,方便但可能导致代码耦合度增加。

phpapplicationscanbeoptimizedForsPeedAndeffificeby:1)启用cacheInphp.ini,2)使用preparedStatatementSwithPdoforDatabasequesies,3)3)替换loopswitharray_filtaray_filteraray_maparray_mapfordataprocrocessing,4)conformentnginxasaseproxy,5)

phpemailvalidation invoLvesthreesteps:1)格式化进行regulareXpressecthemailFormat; 2)dnsvalidationtoshethedomainhasavalidmxrecord; 3)


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

ZendStudio 13.5.1 Mac
功能强大的PHP集成开发环境

记事本++7.3.1
好用且免费的代码编辑器

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

SublimeText3 Linux新版
SublimeText3 Linux最新版

SublimeText3 英文版
推荐:为Win版本,支持代码提示!