Cloud Platform

Troubleshooting PHP timeouts

A PHP timeout occurs when a Drupal or PHP request takes longer than five minutes to produce output, terminates, and produces an HTTP 500 error. Most web browsers, depending on the client, don’t wait longer than two minutes before discontinuing a request and displaying an error.

Long-running processes consume infrastructure resources. If there are too many processes running, it impairs the performance of your application. The Acquia Cloud web stack accommodates requests that require extra time to complete, but does not to allow a process to run indefinitely.

The following are potential causes of PHP timeouts:

  • A cron.php request that runs too long

  • Complex database queries on large quantities of data; for example, multiple JOINs on large database tables

  • Extended database table locks; for example, explicit table locks or structural changes on large tables

  • Drupal Views that produce complex database queries on large databases

  • Calls to slow or unresponsive external service providers using RPC calls, the cURL library, file_get_contents($url), or similar methods

  • Processing extremely large database result sets in PHP code

  • File operations that involve extremely large files or directories

  • PHP bugs; for example, infinite loops or infinite recursions

  • Calls to the sleep() function for extended lengths of time; for example, as an exponential back-off throttle

Some potential solutions for PHP timeout issues include:

  • Use Drush cron instead of cron.php. See Using scheduled jobs to support your application.

  • Enable Drupal’s block cache and views cache. All standard caching techniques are also recommended.

  • Set the call timeout to external services to less than 30 seconds, in case the call becomes unresponsive.

  • Optimize your database queries to examine as few rows and tables as possible to produce the same result.

  • Profile your PHP code to find the functions that take extended amounts of time to complete.

  • Use cron jobs for long-running tasks. Consider moving long-running tasks into cron and caching the results.

Finding problematic pages

To find problematic pages, do the following:

  • Use an application performance monitor tool (such as New Relic) to monitor applications in production and troubleshoot potential performance issues.

  • Examine your application’s Apache logs, which include a request_time field that indicates how many microseconds it takes to deliver each page of your application. Examine the Drupal request logs and look for requests with a long php_time or queue_wait value. You can stream the Drupal request log in real time or download the Drupal request log from the Cloud Platform interface Logs page. See About Cloud Platform logging and Streaming log entries in real time.

  • To view page delivery performance details, use the Drupal Performance logging features in the Devel module. Only use Devel for applications in non-production environments.