PHP实现程序单例运行_PHP教程
PHP实现程序单例运行
一、场景描述:
最近我们一块业务,需要不断的监听一个目录的变化,如果目录中有文件,则启动PHP脚本处理掉。最初的方案是使用crontab执行sh脚本,脚本大概如下:
SOK=`ps -ef |grep /www/sender.sh | grep -v grep|wc -l` if [[ $SOK < 2 ]];then for f in `ls /www/queue`; do php /www/logsender.php /www/queue/$f done
实际运行中出现了异常:ps -ef | grep xxx的方式,可能无法正确的判断进程是否正在执行,if条件永远都不会成立,使得PHP脚本永远不会执行。经过考虑后,决定建立一个独立于其他模块的,能够实现进程单例运行的类,解决这个问题。
二、方案设计
1、通过PID文件实现进程单例
2、程序启动、退出自动创建、删除PID文件,做到不需要业务代码考虑PID文件删除
3、尽量保证代码独立性,不影响业务代码
三、原理
1、启动创建PID文件
2、绑定程序退出、被杀死等信号量,用于删除PID文件
3、添加析构函数,对象被销毁时,删除PID文件
四、遇到的问题
程序正常退出时,无法捕获到信号量,不知道是不是信号量选错了,ctrl+c等信号是正常的,如果可以解决捕获程序正常退出时的信号量,则可以替代析构函数方案,更加稳定
五、代码
<!--?php /** * Created by PhpStorm. * User: huyanping * Date: 14-8-13 * Time: 下午2:25 * * 实现程序单例运行,调用方式: * declare(ticks = 1);//注意:一定要在外部调用文件中首部调用该声明,否则程序会无法监听到信号量 * $single = new DaemonSingle(__FILE__); * $single--->single(); * */ class DaemonSingle { //PID文件路径 private $pid_dir; //PID文件名称 private $filename; //PID文件完整路径名称 private $pid_file; /** * 构造函数 * @param $filename * @param string $pid_dir */ public function __construct($filename, $pid_dir='/tmp/'){ if(empty($filename)) throw new JetException('filename cannot be empty...'); $this->filename = $filename; $this->pid_dir = $pid_dir; $this->pid_file = $this->pid_dir . DIRECTORY_SEPARATOR . substr(basename($this->filename), 0, -4) . '.pid'; } /** * 单例模式启动接口 * @throws JetException */ public function single(){ $this->check_pcntl(); if(file_exists($this->pid_file)) { throw new Exception('the process is already running...'); } $this->create_pid_file(); } /** * @throws JetException */ private function create_pid_file() { if (!is_dir($this->pid_dir)) { mkdir($this->pid_dir); } $fp = fopen($this->pid_file, 'w'); if(!$fp){ throw new Exception('cannot create pid file...'); } fwrite($fp, posix_getpid()); fclose($fp); $this->pid_create = true; } /** * 环境检查 * @throws Exception */ public function check_pcntl() { // Make sure PHP has support for pcntl if (!function_exists('pcntl_signal')) { $message = 'PHP does not appear to be compiled with the PCNTL extension. This is neccesary for daemonization'; throw new Exception($message); } //信号处理 pcntl_signal(SIGTERM, array(&$this, signal_handler)); pcntl_signal(SIGINT, array(&$this, signal_handler)); pcntl_signal(SIGQUIT, array(&$this, signal_handler)); // Enable PHP 5.3 garbage collection if (function_exists('gc_enable')) { gc_enable(); $this->gc_enabled = gc_enabled(); } } /** * 信号处理函数,程序异常退出时,安全删除PID文件 * @param $signal */ public function signal_handler($signal) { switch ($signal) { case SIGINT : case SIGQUIT: case SIGTERM:{ self::safe_quit(); break; } } } /** * 安全退出,删除PID文件 */ public function safe_quit() { if (file_exists($this->pid_file)) { $pid = intval(posix_getpid()); $file_pid = intval(file_get_contents($this->pid_file)); if($pid == $file_pid){ unlink($this->pid_file); } } posix_kill(0, SIGKILL); exit(0); } /** * 析构函数,删除PID文件 */ public function __destruct(){ $this->safe_quit(); } }

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











iPhone의 기본 지도는 Apple의 독점 위치 정보 제공업체인 지도입니다. 지도가 점점 좋아지고 있지만 미국 이외의 지역에서는 잘 작동하지 않습니다. Google 지도와 비교하면 아무것도 제공할 수 없습니다. 이 기사에서는 Google 지도를 사용하여 iPhone의 기본 지도로 만드는 실행 가능한 단계에 대해 설명합니다. iPhone에서 Google 지도를 기본 지도로 설정하는 방법 Google 지도를 휴대전화의 기본 지도 앱으로 설정하는 것은 생각보다 쉽습니다. 아래 단계를 따르십시오. – 전제 조건 단계 – 휴대폰에 Gmail이 설치되어 있어야 합니다. 1단계 – AppStore를 엽니다. 2단계 – “Gmail”을 검색하세요. 3단계 - Gmail 앱 옆을 클릭하세요.

작업을 자동화하고 여러 시스템을 관리하기 위해 임무 계획 소프트웨어는 특히 시스템 관리자에게 유용한 도구입니다. Windows 작업 스케줄러는 작업을 완벽하게 수행하지만 최근 많은 사람들이 운영자 거부 요청 오류를 보고했습니다. 이 문제는 운영 체제의 모든 반복에 존재하며 널리 보고되고 다루어졌음에도 불구하고 효과적인 해결책은 없습니다. 다른 사람들에게 실제로 효과가 있을 수 있는 것이 무엇인지 알아보려면 계속해서 읽어보세요! 운영자 또는 관리자가 거부한 작업 스케줄러 0x800710e0의 요청은 무엇입니까? 작업 스케줄러를 사용하면 사용자 입력 없이 다양한 작업과 응용 프로그램을 자동화할 수 있습니다. 이를 사용하여 특정 애플리케이션을 예약 및 구성하고, 자동 알림을 구성하고, 메시지 전달을 돕는 등의 작업을 할 수 있습니다. 그것

Windows의 작동은 사용자 경험을 향상시키는 매력적인 기능을 포함하여 모든 버전에서 점점 더 좋아지고 있습니다. 사용자가 Windows 10 및 11에서 탐색하고 싶은 기능 중 하나는 사진을 얼굴별로 정렬하는 기능입니다. 이 기능을 사용하면 얼굴 인식을 사용하여 친구와 가족의 사진을 그룹화할 수 있습니다. 재미있을 것 같죠? 이 기능을 활용하는 방법을 알아보려면 계속 읽어보세요. Windows에서 사진을 얼굴별로 그룹화할 수 있나요? 예, Windows 10 및 11에서 사진 앱을 사용하여 사진을 얼굴별로 그룹화할 수 있습니다. 하지만 포토 앱 버전에서는 이 기능을 사용할 수 없습니다. 또한 인물 탭을 사용하여 이러한 사진을 연락처에 연결할 수 있습니다. 따라서 이 기능을 사용하면 다음과 같은 작업을 수행할 수 있습니다.

C++는 카운트다운 프로그램을 작성하는 데 매우 편리하고 실용적인 프로그래밍 언어로 널리 사용됩니다. 카운트다운 프로그램은 매우 정확한 시간 계산 및 카운트다운 기능을 제공할 수 있는 일반적인 애플리케이션입니다. 이 기사에서는 C++를 사용하여 간단한 카운트다운 프로그램을 작성하는 방법을 소개합니다. 카운트다운 프로그램 구현의 핵심은 타이머를 사용하여 시간의 경과를 계산하는 것입니다. C++에서는 time.h 헤더 파일의 함수를 사용하여 타이머 함수를 구현할 수 있습니다. 다음은 간단한 카운트다운 프로그램의 코드입니다.

휴대폰에 시계 앱이 없나요? 날짜와 시간은 iPhone의 상태 표시줄에 계속 표시됩니다. 그러나 시계 앱이 없으면 세계 시계, 스톱워치, 알람 시계 및 기타 여러 기능을 사용할 수 없습니다. 따라서 누락된 시계 앱을 수정하는 것이 해야 할 일 목록의 맨 위에 있어야 합니다. 이러한 솔루션은 이 문제를 해결하는 데 도움이 될 수 있습니다. 수정 1 - 시계 앱 배치 실수로 홈 화면에서 시계 앱을 제거한 경우 시계 앱을 다시 제자리에 배치할 수 있습니다. 1단계 – iPhone을 잠금 해제하고 앱 라이브러리 페이지에 도달할 때까지 왼쪽으로 스와이프합니다. 2단계 – 다음으로 검색창에 “시계”를 검색하세요. 3단계 – 검색 결과 아래에 “시계”가 표시되면 길게 누르고

매일 같은 시간에 같은 웹사이트를 자주 방문하시나요? 이로 인해 여러 브라우저 탭을 열어두고 일상적인 작업을 수행하는 동안 브라우저가 복잡해지는 데 많은 시간을 소비하게 될 수 있습니다. 그렇다면 브라우저를 수동으로 실행할 필요 없이 열어보는 것은 어떨까요? 매우 간단하며 아래와 같이 타사 앱을 다운로드할 필요가 없습니다. 웹사이트를 열려면 작업 스케줄러를 어떻게 설정하나요? 키를 누르고 검색 상자에 작업 스케줄러를 입력한 다음 열기를 클릭합니다. Windows 오른쪽 사이드바에서 기본 작업 생성 옵션을 클릭합니다. 이름 필드에 열려는 웹사이트의 이름을 입력하고 다음을 클릭하세요. 그런 다음 트리거에서 시간 빈도를 클릭하고 다음을 클릭합니다. 이벤트를 반복할 기간을 선택하고 다음을 클릭하세요. 활성화 선택

iOS에서는 iPhone을 세로에서 가로로 회전하면 많은 앱이 서로 다른 보기를 표시합니다. 앱과 사용 방법에 따라 이 동작이 항상 바람직한 것은 아니므로 Apple은 제어 센터에 방향 잠금 옵션을 포함합니다. 그러나 일부 앱은 방향 잠금이 비활성화된 상태에서 더 유용하게 작동합니다. YouTube나 사진 앱을 생각해 보세요. 기기를 가로 방향으로 회전하면 전체 화면 보기 환경이 더 좋아집니다. 잠금 상태를 유지하려면 이러한 유형의 앱을 열 때마다 전체 화면 경험을 얻기 위해 제어 센터에서 해당 기능을 비활성화해야 합니다. 그런 다음 앱을 닫을 때 방향 잠금을 다시 켜야 한다는 것을 기억해야 하는데 이는 이상적이지 않습니다. 다행히도 다음을 만들 수 있습니다.

앱을 사용하려고 할 때 "카메라 및 마이크에 대한 접근을 허용할 수 없습니다"라는 메시지가 표시됩니까? 일반적으로 필요에 따라 특정 사람에게 카메라 및 마이크 권한을 부여합니다. 단, 권한을 거부할 경우 카메라와 마이크가 작동하지 않으며 대신 이런 오류 메시지가 표시됩니다. 이 문제를 해결하는 것은 매우 기본적이며 1~2분 안에 완료할 수 있습니다. 수정 1 – 카메라, 마이크 권한 제공 설정에서 직접 필요한 카메라 및 마이크 권한을 제공할 수 있습니다. 1단계 - 설정 탭으로 이동합니다. 2단계 – 개인 정보 보호 및 보안 패널을 엽니다. 3단계 - 거기에서 "카메라" 권한을 켭니다. 4단계 - 내부에서 휴대폰 카메라에 대한 권한을 요청한 앱 목록을 찾을 수 있습니다. 5단계 - 지정된 앱의 "카메라"를 엽니다.
