Outputting Text to Browser During PHP Script Execution

Started by keiron, Jan 29, 2023, 03:36 AM

Previous topic - Next topic

keironTopic starter

If you work with long scripts, you might need to display real-time data on the browser screen to monitor the progress of the script's execution. A code example taken from the internet was expected to show "data" 11 times per second through text output. However, this code failed to work with both Denver and NIC/CENTER hosting.

There were mixed results regarding the effectiveness of flush()/ob_flush() on this issue even after a few days of research. Therefore, it is still unclear how to continuously show the formatting code to the browser, even when using header('Content-Type: text/event-stream').

Here's an example code that can be used for this purpose:

ob_implicit_flush(1);
for($s='', $x=0; $x<10; $x++) {
  ob_start();
  echo 'data';
  $s = ob_get_contents();
  ob_flush();
  flush();
  ob_end_clean();
  ob_end_flush();
  sleep(1);
}
  •  

carlos

While the inquiry is quite extensive, I'll try to provide an answer. The issue may be caused by Apache's utilization on the server, which applies gzip and halts data transmission until the script is completed.

Furthermore, certain web browsers won't begin rendering due to the "Redraw the entire page after full loading" setting. Specific browsers need 500-100500 characters or more to work correctly when the page is incomplete, while others require that the document structure be analyzed for potential issues before any output can begin.

If you're only trying to monitor a long script, the simplest solution is to run it through the console. However, if you need to output results to the browser, you could attempt using Opera 12 with settings configured to redraw the page in one second, but use it cautiously. Another workaround is to write the results to a text file during execution and then refresh it manually with [F5] or with a script.
  •  

SASASoftware

The best solution to the problem is to use Websocket. The HTTP protocol does not support partial responses, and even if it works, it can be easily disrupted by a proxy. Websocket protocol was created to tackle various problems in HTTP, including server-side transmission commencement and uninterrupted connections with fixed data amounts. Despite requiring some effort, using Websockets is by far the best option compared to other solutions, except for scheduled server polling, which has similar vulnerability to attacks.

However, I suspect that the issue at hand is the execution of heavy computations within a web request. This can cause the server to crash (if multiple users run heavy computations at once) or PHP to throw timeout errors, making the computation process useless. HTTP responses must be delivered as expeditiously and efficiently as possible, while third-party tasks should remain separate from the primary workflow.

Several message and queue services have been developed explicitly to address these types of challenges. Simple implementations like Gearman can be integrated into projects in no time, while sophisticated systems like AMQP provide flexible routing configurations. The queue service scheme requires the server to push heavy computation requests into the queue and quickly return a response. Meanwhile, a specified number of worker processes run in the background, gradually handling queued requests.

This approach prevents server crashes, timeouts, and aids in scaling since workflows can be executed on different servers. The only concern that may arise is a queue overflow, which can be resolved by increasing resources to workflows. By creating a separate method that retrieves progress data by task ID from the database, lightweight Ajax polling can be employed every hundred milliseconds without impacting the service negatively.
  •  

Charlesth

I find this to be illogical because the execution time of the same code can differ significantly when restarted. As for my use of commas, I structure my text the same way as a conversation, so there's no need to discuss it publicly.

All modern operating systems have multitasking capabilities, with various ready-made tasks vying for processor time. Furthermore, timer update time can produce errors, particularly at small values. As a result, obtaining the exact time is not practical, particularly in PHP. For small values, we can determine an approximate average execution time by running the script of interest in a cycle several thousand times.
  •