-1

I did not want to do it using "shell, exec, etc"... Only with loop in php!

My understanding is in this case:

  1. I have a form in page, on form submit, i will call on a PHP script which will run in Background.
  2. Background process started and running ....running ....running .....running......
  3. I want to got back process id with which Process id Background process started and previous background process running ....running ....running .....running ..........

I need to do this, and if possible a file where it executes a single code with loop until finish some line


Idea to project structure: click here

2 Answers2

0

Many, many moons ago I wrote a PHP daemon which ran endlessly in the background on a client system that received instructions by polling a server and then performed various file I/O actions in response. For what it's worth, here's the relevant portion of the code that allowed this to run as a daemon, i.e. a background PHP process:

// (Note:
// The writeLog() function has been set up previously and is a 
// trivial function that adds timestamped lines into a logfile.)


$PIDfile='/tmp/myPID';           // Store process ID in this file

// If a deamon is already running, display its PID and abort:
if (file_exists ($PIDfile)) {
  if (is_readable ($PIDfile))
    die ($PIDfile . " already exists, PID=" . 
         file_get_contents ($PIDfile) . " (stale PID file?)\n");
  else
  die ($PIDfile . " already exists, but is not readable.\n");
}

// Set execution directives if we're running a PHP version prior to 5.3.0
// (ticks are deprecated as of PHP5.3.0 and will be removed from PHP6.0.0):
if (version_compare (PHP_VERSION, '5.3.0', '<'))
  declare (ticks = 1);

// Fork off the background (daemon) process:
$pid = pcntl_fork ();
if ($pid == -1) {
  die ("Fatal: unable to fork.\n");
} elseif ($pid)
  exit ();                                      // We are the parent process

// If we arrive at this point, we are the child process.
// Detach from the controlling terminal:
if (posix_setsid () == -1)
  die ("Fatal: unable to detach from terminal.\n");

// Register child PID:
$posid = posix_getpid ();
$fp = fopen ($PIDfile, "w");
fwrite ($fp, $posid);
fclose ($fp);

// Set up signal handlers:
pcntl_signal (SIGTERM, "SIGhandler");
pcntl_signal (SIGHUP, "SIGhandler");

// Log successful deamonization:
writeLog ("Daemon spawned, PID = " . $posid);

// Daemon payload code starts here:

while (1) {

  // Do all kinds of interesting stuff that does not require any user
  // input or screen output. In my case this consisted of file I/O and
  // communication with a server using various sockets.

}

// EOF

Hope this helps! Needless to say the above is a copy-and-paste of years old stuff from my code morgue and is supplied without any warranty or guarantee whatsoever. Enjoy!

  • 1
    Please note that the [PCNTL extension](http://php.net/manual/en/intro.pcntl.php) is not available on Windows. – Álvaro González Jun 21 '17 at 09:57
  • Good point, and thank you! Although when I'm trying to fork a process in order to create a daemon I'm sort of automatically thinking *ix and not Windows, but that's just me... :) – Frank van Wensveen Jun 21 '17 at 14:47
0

Background Process Execution: code font

<?php
set_time_limit(7200);
ignore_user_abort(true);

fopen('./.exec','w');

$conn = mysql_connect($servidor,$usuario,$senha);
mysql_select_db($bdados);

while (file_exists('./.exec')) {
    clearstatcache();
    if (file_exists('./.in') && filesize('./.in')) {
        $out = fopen('./.out','w');
        $query = mysql_query(file_get_contents('./.in'));
        $campos = mysql_num_fields($query);
        $sep = '';
        for ($i = 0; $i < $campos; $i++) {
            fwrite($out,$sep.mysql_field_name($query,$i));
            $sep = ';';
        }
        fwrite($out,"\n");
        while ($res = mysql_fetch_row($query)) {
            for ($i = 1; $i < $campos; $i++) {
                fwrite($out,$sep.$res[$i]);
                $sep = ';';
            }
            fwrite($out,"\n");
        }
        fclose($out);
        fclose(fopen('./.in','w'));
    }
    sleep(1);
}
?>

Maybe something like that, what do you say?

I want to make it work, without mysqli & mysql.