PHP: How to return information to a waiting script and continue processing

后端 未结 7 2042
暖寄归人
暖寄归人 2021-02-09 22:14

Suppose there are two scripts Requester.php and Provider.php, and Requester requires processing from Provider and makes an http request to it (Provider.php?data=\"data\"). In th

相关标签:
7条回答
  • 2021-02-09 22:37

    You could start another php process in Provider.php using pcntl_fork()

    Provider.php 
    {
        // Fork process
        $pid = pcntl_fork();
    
        // You are now running both a daemon process and the parent process
        // through the rest of the code below
    
        if ($pid > 0) {
            // PARENT Process
            $answer = getAnswer($_GET['data']);
            echo $answer;    
            //SIGNAL TO REQUESTER THAT WE ARE FINISHED
            return;
        }
    
        if ($pid == 0) {
            // DAEMON Process
            processDBUpdates();
            return;
        }
    
        // If you get here the daemon process failed to start
        handleDaemonErrorCondition();
        return;
    
    }
    
    0 讨论(0)
  • 2021-02-09 22:39

    I'm going out on a limb here, but perhaps you should try cURL or use a socket to update the requester?

    0 讨论(0)
  • 2021-02-09 22:43

    I use this code for running a process in the background (works on Linux).

    The process runs with its output redirected to a file.

    That way, if I need to display status on the process, it's just a matter of writing a small amount of code to read and display the contents of the output file.

    I like this approach because it means you can completely close the browser and easily come back later to check on the status.

    0 讨论(0)
  • 2021-02-09 22:45

    You can flush the output buffer with the flush() command.
    Read the comments in the PHP manual for more info

    0 讨论(0)
  • 2021-02-09 22:46

    Split the Provider in two: ProviderCore and ProviderInterface. In ProviderInterface just do the "quick and easy" part, also save a flag in database that the recent request hasn't been processed yet. Run ProviderCore as a cron job that searches for that flag and completes processing. If there's nothing to do, ProviderCore will terminate and retry in (say) 2 minutes.

    0 讨论(0)
  • 2021-02-09 22:52

    You basically want to signal the end of 1 process (return to the original Requester.php) and spawn a new process (finish Provider.php). There is probably a more elegant way to pull this off, but I've managed this a couple different ways. All of them basically result in exec-ing a command in order to shell off the second process.

    adding the following > /dev/null 2>&1 & to the end of your command will allow it to run in the background without inhibiting the actual execution of your current script

    Something like the following may work for you:

    exec("wget -O - \"$url\" > /dev/null 2>&1 &"); 
    

    -- though you could do it as a command line PHP process as well.

    You could also save the information that needs to be processed and handle the remaining processing on a cron job that re-creates the same sort of functionality without the need to exec.

    0 讨论(0)
提交回复
热议问题