Ardeus
Ardeus

Reputation: 2001

PHP: Cancel running script using POST/AJAX?

My php script uses php simplehtmldom to parse html and get all the links and images that I want and this can run for a duration depending on the amount of images to download.

I thought it would be good idea to allow cancelling in this case. Currently I call my php using Jquery-Ajax, the closest thing I could find is php register_shutdown_function but not sure if it can work for my case. Any ideas?

So once php is launched, it cant be disturbed? like fire ajax again to call an exit to the same php file?

Upvotes: 1

Views: 623

Answers (1)

castor
castor

Reputation: 583

This is good only in case you are processing really massive data loads through AJAX. For other cases, just handle it in JS to not display result if canceled.

But as I said If you are processing huge loads of data, then you can add a interrupt condition in every nth step of running script and fulfill that condition using another script. For example you can use a file to store a interrupt data, or MySQL MEMORY table.

Example.

1, process.php (ajax script processing loads of data)

// clean up previous potential interrupt flag
$fileHandler = fopen('interrupt_condition.txt', 'w+');
fwrite($fileHandler, '0');
fclose($fileHandler);

function interrupt_check() {
   $interruptfile = file('interrupt_condition.txt');
   if (trim($interruptfile[0]) == "1") {    // read first line, trim it and parse value - if value == 1 interrupt script
      echo json_encode("interrupted" => 1);
      die();
   }
}

$i = 0;
foreach ($huge_load_of_data as $object) {
   $i++;
   if ($i % 10 == 0) { // check for interrupt condition every 10th record
      interrupt_check();
   }

   // your processing code
}
interrupt_check(); // check for last time (if something changed while processing the last 10 entries)

2, interrupt_process.php (ajax script to propagate cancel event to file)

$fileHandler = fopen('interrupt_condition.txt', 'w+');
fwrite($fileHandler, '1');
fclose($fileHandler);

This will definitely affect performance of your script, but makes you a backdoor to close execution. This is very simple example - you need to make it more complex to make it work for more users simultaneously, etc.

You can also use MySQL MEMORY Table, MEMCACHE - Non-persistent Caching Server or whatever non-persistent storage you could find.

Upvotes: 1

Related Questions