Jump to content

Asynchronous PHP calls

Recommended Posts

I'm running into a few issues regarding my web application written in PHP.

I'm wanting to post some data (already collected) without waiting for a response. I know that the page this posts to will take forever and a half to get through because it has to send multiple emails through a server that takes forever to do one. So I definitely do not want to block this page whilst the script is running.

 I looked around and I found this function, but I'm having some issues with it.

function post_without_wait($url, $params)

  foreach ($params as $key => &$val) {
    if (is_array($val)) $val = implode(',', $val);
    $post_params[] = $key . '=' . urlencode($val);
  $post_string = implode('&', $post_params);
  $parts = parse_url($url);
  $fp = fsockopen(
    isset($parts['port']) ? $parts['port'] : 443,
  if (!$fp) {
    throw new Exception($errno . ' - ' . $errstr);

  $out = "POST " . $parts['path'] . " HTTP/1.1\r\n";
  $out .= "Host: " . $parts['host'] . "\r\n";
  $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
  $out .= "Content-Length: " . strlen($post_string) . "\r\n";
  $out .= "Connection: Close\r\n\r\n";
  if (isset($post_string)) $out .= $post_string;
  fwrite($fp, $out);


Whenever I use this, using my URL and the whole $_POST array,  I get

HTTP/1.1 400 Bad Request Date: Fri, 31 Aug 2018 01:04:56 GMT Server: Apache/2.4.33 (Win32) OpenSSL/1.1.0h PHP/7.2.5 Vary: accept-language,accept-charset Accept-Ranges: bytes Connection: close Content-Type: text/html; charset=utf-8 Content-Language: en Expires: Fri, 31 Aug 2018 01:04:56 GMT


I can confirm that the page it is posting to never even runs, as I've set up an exception that is not being caught by my debugging tools.

I'm using port 443 as it is my SSL port I'm running on. Port 80 gives me a 301 permanent redirect (I only want HTTPS, this is sensitive anyway).


Does anything look amiss with the creation of this request?

Edited by Funce

Share this post

Link to post
Share on other sites

That looks fine in general, I guess you could print all of the headers just to verify.  The problem might be SSL negotiation, I'm not sure that just opening a socket to 443 will result in the entire SSL/TLS handshake process automatically.  Also, I don't think that's going to run asynchronously.

You might want to fork a child process and then just use something like cURL, which will do all of the SSL/TLS negotiation.

Share this post

Link to post
Share on other sites

Yeap! You would be correct. I've now managed to get this to work. I'm instead using stream_socket_client in place of fsockopen. My local server doesn't have a proper certificate installed, so I've just currently made it ignore SSL verification.


Thank you for the insight.

Share this post

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Create New...