Run php script as daemon process

后端 未结 14 1698
-上瘾入骨i
-上瘾入骨i 2020-11-22 11:36

I need to run a php script as daemon process (wait for instructions and do stuff). cron job will not do it for me because actions need to be taken as soon as instruction arr

14条回答
  •  陌清茗
    陌清茗 (楼主)
    2020-11-22 12:32

    With new systemd you can create a service.

    You must create a file or a symlink in /etc/systemd/system/, eg. myphpdaemon.service and place content like this one, myphpdaemon will be the name of the service:

    [Unit]
    Description=My PHP Daemon Service
    #May your script needs MySQL or other services to run, eg. MySQL Memcached
    Requires=mysqld.service memcached.service 
    After=mysqld.service memcached.service
    
    [Service]
    User=root
    Type=simple
    TimeoutSec=0
    PIDFile=/var/run/myphpdaemon.pid
    ExecStart=/usr/bin/php -f /srv/www/myphpdaemon.php arg1 arg2> /dev/null 2>/dev/null
    #ExecStop=/bin/kill -HUP $MAINPID #It's the default you can change whats happens on stop command
    #ExecReload=/bin/kill -HUP $MAINPID
    KillMode=process
    
    Restart=on-failure
    RestartSec=42s
    
    StandardOutput=null #If you don't want to make toms of logs you can set it null if you sent a file or some other options it will send all php output to this one.
    StandardError=/var/log/myphpdaemon.log
    [Install]
    WantedBy=default.target
    

    You will be able to start, get status, restart and stop the services using the command

    systemctl myphpdaemon

    The PHP script should have a kind of "loop" to continue running.

    Working example:

    [Unit]
    Description=PHP APP Sync Service
    Requires=mysqld.service memcached.service
    After=mysqld.service memcached.service
    
    [Service]
    User=root
    Type=simple
    TimeoutSec=0
    PIDFile=/var/run/php_app_sync.pid
    ExecStart=/bin/sh -c '/usr/bin/php -f /var/www/app/private/server/cron/app_sync.php  2>&1 > /var/log/app_sync.log'
    KillMode=mixed
    
    Restart=on-failure
    RestartSec=42s
    
    [Install]
    WantedBy=default.target
    

    If your PHP routine should be executed once in a cycle (like a diggest) you may should use a shell or bash script to be invoked into systemd service file instead of PHP directly, for example:

    #!/usr/bin/env bash
    script_path="/app/services/"
    
    while [ : ]
    do
    #    clear
        php -f "$script_path"${1}".php" fixedparameter ${2}  > /dev/null 2>/dev/null
        sleep 1
    done
    

    If you chose these option you should change the KillMode to mixed to processes, bash(main) and PHP(child) be killed.

    ExecStart=/app/phpservice/runner.sh phpfile parameter  > /dev/null 2>/dev/null
    KillMode=process
    

    This method also is effective if you're facing a memory leak.

    Note: Every time that you change your "myphpdaemon.service" you must run `systemctl daemon-reload', but do worry if you not do, it will be alerted when is needed.

提交回复
热议问题