{"type":"rich","version":"1.0","provider_name":"phorkie","provider_url":"https:\/\/p.cweiske.de\/","title":"Using socket_connect with a reliable timeout in PHP \u00b7 GitHub","author_name":"Christian Weiske","cache_age":86400,"width":900,"height":900,"html":"<!-- embedding all files of https:\/\/p.cweiske.de\/632 -->\n<link rel=\"stylesheet\" href=\"https:\/\/p.cweiske.de\/css\/embed.css\"\/>\n<div class=\"phork\" id=\"632\">\n    <div class=\"phork-file\">\n <div class=\"phork-content\">\n  <style type=\"text\/css\">\/**\n * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2014 Benny Baumann\n * (http:\/\/qbnz.com\/highlighter\/ and http:\/\/geshi.org\/)\n *\/\n.php .de1, .php .de2 {font: normal normal 1em\/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;}\n.php  {font-family:monospace;}\n.php .imp {font-weight: bold; color: red;}\n.php li, .php .li1 {color: #DDD;}\n.php .ln {width:1px;text-align:right;margin:0;padding:0 2px;vertical-align:top;}\n.php .kw1 {color: #b1b100;}\n.php .kw2 {color: #000000; font-weight: bold;}\n.php .kw3 {color: #990000;}\n.php .kw4 {color: #009900; font-weight: bold;}\n.php .co1 {color: #666666; font-style: italic;}\n.php .co2 {color: #666666; font-style: italic;}\n.php .co3 {color: #0000cc; font-style: italic;}\n.php .co4 {color: #009933; font-style: italic;}\n.php .coMULTI {color: #666666; font-style: italic;}\n.php .es0 {color: #000099; font-weight: bold;}\n.php .es1 {color: #000099; font-weight: bold;}\n.php .es2 {color: #660099; font-weight: bold;}\n.php .es3 {color: #660099; font-weight: bold;}\n.php .es4 {color: #006699; font-weight: bold;}\n.php .es5 {color: #006699; font-weight: bold; font-style: italic;}\n.php .es6 {color: #009933; font-weight: bold;}\n.php .es_h {color: #000099; font-weight: bold;}\n.php .br0 {color: #009900;}\n.php .sy0 {color: #339933;}\n.php .sy1 {color: #000000; font-weight: bold;}\n.php .st0 {color: #0000ff;}\n.php .st_h {color: #0000ff;}\n.php .nu0 {color: #cc66cc;}\n.php .nu8 {color: #208080;}\n.php .nu12 {color: #208080;}\n.php .nu19 {color:#800080;}\n.php .me1 {color: #004000;}\n.php .me2 {color: #004000;}\n.php .re0 {color: #000088;}\n.php span.xtra { display:block; }\n<\/style><div class=\"code\"><table class=\"php\"><tbody><tr class=\"li1\"><td class=\"ln\"><pre class=\"de1\">1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n36\n37\n38\n39\n40\n41\n42\n43\n44\n45\n46\n47\n48\n49\n50\n51\n52\n53\n54\n55\n56\n57\n58\n59\n60\n61\n62\n63\n64\n65\n66\n67\n68\n69\n70\n71\n72\n73\n74\n75\n76\n77\n78\n79\n80\n81\n82\n83\n84\n85\n86\n87\n88\n89\n90\n91\n92\n93\n94\n95\n96\n97\n98\n99\n100\n101\n102\n103\n104\n105\n106\n107\n108\n109\n110\n111\n112\n113\n114\n115\n116\n117\n118\n119\n120\n121\n122\n123\n124\n125\n126\n127\n128\n129\n130\n131\n132\n133\n134\n135\n136\n137\n138\n139\n140\n141\n142\n143\n144\n145\n146\n147\n148\n149\n150\n151\n152\n153\n154\n155\n156\n157\n158\n159\n160\n161\n162\n163\n164\n165\n166\n167\n168\n169\n170\n171\n172\n173\n174\n175\n176\n177\n178\n179\n180\n181\n182\n183\n184\n185\n186\n187\n188\n189\n190\n191\n192\n193\n194\n195\n196\n197\n198\n199\n200\n201\n202\n203\n204\n205\n<\/pre><\/td><td class=\"de1\"><pre class=\"de1\"><span class=\"kw2\">&lt;?php<\/span>\n&#160;\n<span class=\"co4\">\/**<\/span>\n<span class=\"co4\">&#160;* I was having trouble with socket connections timing out reliably. Sometimes,<\/span>\n<span class=\"co4\">&#160;* my timeout would be reached. Other times, the connect would fail after three<\/span>\n<span class=\"co4\">&#160;* to six seconds. I finally figured out it had to do with trying to connect to<\/span>\n<span class=\"co4\">&#160;* a routable, non-localhost address. It seems the socket_connect call would<\/span>\n<span class=\"co4\">&#160;* not fail immediately for those connections. This function is what I finally<\/span>\n<span class=\"co4\">&#160;* ended up with that reliably connects to a working server, fails quickly for<\/span>\n<span class=\"co4\">&#160;* a server that has an address\/port that is not reachable and will reach the<\/span>\n<span class=\"co4\">&#160;* timeout for routable addresses that are not up.<\/span>\n<span class=\"co4\">&#160;*<\/span>\n<span class=\"co4\">&#160;* Full Story: http:\/\/brian.moonspot.net\/socket-connect-timeout<\/span>\n<span class=\"co4\">&#160;*<\/span>\n<span class=\"co4\">&#160;* Copyright (c) 2015, Brian Moon of DealNews.com, Inc.<\/span>\n<span class=\"co4\">&#160;* All rights reserved.<\/span>\n<span class=\"co4\">&#160;*<\/span>\n<span class=\"co4\">&#160;* Redistribution and use in source and binary forms, with or without<\/span>\n<span class=\"co4\">&#160;* modification, are permitted provided that the following conditions<\/span>\n<span class=\"co4\">&#160;* are met:<\/span>\n<span class=\"co4\">&#160;*<\/span>\n<span class=\"co4\">&#160;* &#160;* Redistributions of source code must retain the above copyright<\/span>\n<span class=\"co4\">&#160;* &#160; &#160;notice, this list of conditions and the following disclaimer.<\/span>\n<span class=\"co4\">&#160;* &#160;* Redistributions in binary form must reproduce the above<\/span>\n<span class=\"co4\">&#160;* &#160; &#160;copyright notice, this list of conditions and the following<\/span>\n<span class=\"co4\">&#160;* &#160; &#160;disclaimer in the documentation and\/or other materials provided<\/span>\n<span class=\"co4\">&#160;* &#160; &#160;with the distribution.<\/span>\n<span class=\"co4\">&#160;* &#160;* Neither the name of DealNews.com Inc. nor the names of its<\/span>\n<span class=\"co4\">&#160;* &#160; &#160;contributors may be used to endorse or promote products derived<\/span>\n<span class=\"co4\">&#160;* &#160; &#160;from this software without specific prior written permission.<\/span>\n<span class=\"co4\">&#160;*<\/span>\n<span class=\"co4\">&#160;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS<\/span>\n<span class=\"co4\">&#160;* &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT<\/span>\n<span class=\"co4\">&#160;* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS<\/span>\n<span class=\"co4\">&#160;* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE<\/span>\n<span class=\"co4\">&#160;* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,<\/span>\n<span class=\"co4\">&#160;* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES<\/span>\n<span class=\"co4\">&#160;* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR<\/span>\n<span class=\"co4\">&#160;* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)<\/span>\n<span class=\"co4\">&#160;* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,<\/span>\n<span class=\"co4\">&#160;* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)<\/span>\n<span class=\"co4\">&#160;* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED<\/span>\n<span class=\"co4\">&#160;* OF THE POSSIBILITY OF SUCH DAMAGE.<\/span>\n<span class=\"co4\">&#160;*<\/span>\n<span class=\"co4\">&#160;*\/<\/span>\n&#160;\n<span class=\"co4\">\/**<\/span>\n<span class=\"co4\">&#160;* Example:<\/span>\n<span class=\"co4\">&#160;*<\/span>\n<span class=\"co4\">&#160;* Assuming these hosts are valid for your setup, this example would produce<\/span>\n<span class=\"co4\">&#160;* something like this:<\/span>\n<span class=\"co4\">&#160;*<\/span>\n<span class=\"co4\">&#160;* Trying: Good host...<\/span>\n<span class=\"co4\">&#160;* resource(10) of type (Socket)<\/span>\n<span class=\"co4\">&#160;*<\/span>\n<span class=\"co4\">&#160;* Trying: Routable, but not up...<\/span>\n<span class=\"co4\">&#160;* Failed to connect to 10.1.2.30:4730. (timed out after 102.1051ms)<\/span>\n<span class=\"co4\">&#160;* NULL<\/span>\n<span class=\"co4\">&#160;*<\/span>\n<span class=\"co4\">&#160;* Trying: Up but not listening...<\/span>\n<span class=\"co4\">&#160;* Failed to connect to 127.0.0.1:7676. (111: Connection refused; after 0.051ms)<\/span>\n<span class=\"co4\">&#160;* NULL<\/span>\n<span class=\"co4\">&#160;*<\/span>\n<span class=\"co4\">&#160;* =====<\/span>\n<span class=\"co4\">&#160;*<\/span>\n<span class=\"co4\">&#160;* $timeout = 100;<\/span>\n<span class=\"co4\">&#160;*<\/span>\n<span class=\"co4\">&#160;* $hosts = array(<\/span>\n<span class=\"co4\">&#160;* &#160; &#160; array(<\/span>\n<span class=\"co4\">&#160;* &#160; &#160; &#160; &#160; &quot;desc&quot; =&gt; &quot;Good host&quot;,<\/span>\n<span class=\"co4\">&#160;* &#160; &#160; &#160; &#160; &quot;host&quot; =&gt; &quot;127.0.0.1&quot;,<\/span>\n<span class=\"co4\">&#160;* &#160; &#160; &#160; &#160; &quot;port&quot; =&gt; &quot;4730&quot;<\/span>\n<span class=\"co4\">&#160;* &#160; &#160; ),<\/span>\n<span class=\"co4\">&#160;* &#160; &#160; array(<\/span>\n<span class=\"co4\">&#160;* &#160; &#160; &#160; &#160; &quot;desc&quot; =&gt; &quot;Routable, but not up&quot;,<\/span>\n<span class=\"co4\">&#160;* &#160; &#160; &#160; &#160; &quot;host&quot; =&gt; &quot;10.1.2.30&quot;,<\/span>\n<span class=\"co4\">&#160;* &#160; &#160; &#160; &#160; &quot;port&quot; =&gt; &quot;4730&quot;<\/span>\n<span class=\"co4\">&#160;* &#160; &#160; ),<\/span>\n<span class=\"co4\">&#160;* &#160; &#160; array(<\/span>\n<span class=\"co4\">&#160;* &#160; &#160; &#160; &#160; &quot;desc&quot; =&gt; &quot;Up but not listening&quot;,<\/span>\n<span class=\"co4\">&#160;* &#160; &#160; &#160; &#160; &quot;host&quot; =&gt; &quot;127.0.0.1&quot;,<\/span>\n<span class=\"co4\">&#160;* &#160; &#160; &#160; &#160; &quot;port&quot; =&gt; &quot;7676&quot;<\/span>\n<span class=\"co4\">&#160;* &#160; &#160; ),<\/span>\n<span class=\"co4\">&#160;* );<\/span>\n<span class=\"co4\">&#160;*<\/span>\n<span class=\"co4\">&#160;* foreach($hosts as $host){<\/span>\n<span class=\"co4\">&#160;*<\/span>\n<span class=\"co4\">&#160;* &#160; &#160; echo &quot;Trying: $host[desc]...\\n&quot;;<\/span>\n<span class=\"co4\">&#160;*<\/span>\n<span class=\"co4\">&#160;* &#160; &#160; try{<\/span>\n<span class=\"co4\">&#160;* &#160; &#160; &#160; &#160; $socket = socket_connect_timeout($host[&quot;host&quot;], $host[&quot;port&quot;], $timeout);<\/span>\n<span class=\"co4\">&#160;* &#160; &#160; } catch(Exception $e){<\/span>\n<span class=\"co4\">&#160;* &#160; &#160; &#160; &#160; echo $e-&gt;getMessage().&quot;\\n&quot;;<\/span>\n<span class=\"co4\">&#160;* &#160; &#160; &#160; &#160; $socket = null;<\/span>\n<span class=\"co4\">&#160;* &#160; &#160; }<\/span>\n<span class=\"co4\">&#160;*<\/span>\n<span class=\"co4\">&#160;* &#160; &#160; var_dump($socket);<\/span>\n<span class=\"co4\">&#160;*<\/span>\n<span class=\"co4\">&#160;* &#160; &#160; echo &quot;\\n&quot;;<\/span>\n<span class=\"co4\">&#160;*<\/span>\n<span class=\"co4\">&#160;* }<\/span>\n<span class=\"co4\">&#160;*<\/span>\n<span class=\"co4\">&#160;*\/<\/span>\n&#160;\n&#160;<span class=\"kw2\">function<\/span> socket_connect_timeout<span class=\"br0\">&#40;<\/span><span class=\"re0\">$host<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$port<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$timeout<\/span><span class=\"sy0\">=<\/span><span class=\"nu0\">100<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span>\n&#160;\n&#160; &#160; <span class=\"re0\">$socket<\/span> <span class=\"sy0\">=<\/span> <a href=\"http:\/\/www.php.net\/socket_create\"><span class=\"kw3\">socket_create<\/span><\/a><span class=\"br0\">&#40;<\/span>AF_INET<span class=\"sy0\">,<\/span> SOCK_STREAM<span class=\"sy0\">,<\/span> SOL_TCP<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n&#160;\n&#160; &#160; <span class=\"co4\">\/**<\/span>\n<span class=\"co4\">&#160; &#160; &#160;* Set the send and receive timeouts super low so that socket_connect<\/span>\n<span class=\"co4\">&#160; &#160; &#160;* will return to us quickly. We then loop and check the real timeout<\/span>\n<span class=\"co4\">&#160; &#160; &#160;* and check the socket error to decide if its conected yet or not.<\/span>\n<span class=\"co4\">&#160; &#160; &#160;*\/<\/span>\n&#160; &#160; <span class=\"re0\">$connect_timeval<\/span> <span class=\"sy0\">=<\/span> <a href=\"http:\/\/www.php.net\/array\"><span class=\"kw3\">array<\/span><\/a><span class=\"br0\">&#40;<\/span>\n&#160; &#160; &#160; &#160; <span class=\"st0\">&quot;sec&quot;<\/span><span class=\"sy0\">=&gt;<\/span><span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span>\n&#160; &#160; &#160; &#160; <span class=\"st0\">&quot;usec&quot;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"nu0\">100<\/span>\n&#160; &#160; <span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n&#160; &#160; <a href=\"http:\/\/www.php.net\/socket_set_option\"><span class=\"kw3\">socket_set_option<\/span><\/a><span class=\"br0\">&#40;<\/span>\n&#160; &#160; &#160; &#160; <span class=\"re0\">$socket<\/span><span class=\"sy0\">,<\/span>\n&#160; &#160; &#160; &#160; SOL_SOCKET<span class=\"sy0\">,<\/span>\n&#160; &#160; &#160; &#160; SO_SNDTIMEO<span class=\"sy0\">,<\/span>\n&#160; &#160; &#160; &#160; <span class=\"re0\">$connect_timeval<\/span>\n&#160; &#160; <span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n&#160; &#160; <a href=\"http:\/\/www.php.net\/socket_set_option\"><span class=\"kw3\">socket_set_option<\/span><\/a><span class=\"br0\">&#40;<\/span>\n&#160; &#160; &#160; &#160; <span class=\"re0\">$socket<\/span><span class=\"sy0\">,<\/span>\n&#160; &#160; &#160; &#160; SOL_SOCKET<span class=\"sy0\">,<\/span>\n&#160; &#160; &#160; &#160; SO_RCVTIMEO<span class=\"sy0\">,<\/span>\n&#160; &#160; &#160; &#160; <span class=\"re0\">$connect_timeval<\/span>\n&#160; &#160; <span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n&#160;\n&#160; &#160; <span class=\"re0\">$now<\/span> <span class=\"sy0\">=<\/span> <a href=\"http:\/\/www.php.net\/microtime\"><span class=\"kw3\">microtime<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"kw4\">true<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n&#160;\n&#160; &#160; <span class=\"co4\">\/**<\/span>\n<span class=\"co4\">&#160; &#160; &#160;* Loop calling socket_connect. As long as the error is 115 (in progress)<\/span>\n<span class=\"co4\">&#160; &#160; &#160;* or 114 (already called) and our timeout has not been reached, keep<\/span>\n<span class=\"co4\">&#160; &#160; &#160;* trying.<\/span>\n<span class=\"co4\">&#160; &#160; &#160;*\/<\/span>\n&#160; &#160; <span class=\"re0\">$err<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw4\">null<\/span><span class=\"sy0\">;<\/span>\n&#160; &#160; <span class=\"re0\">$socket_connected<\/span> <span class=\"sy0\">=<\/span> <span class=\"kw4\">false<\/span><span class=\"sy0\">;<\/span>\n&#160; &#160; <span class=\"kw1\">do<\/span><span class=\"br0\">&#123;<\/span>\n&#160; &#160; &#160; &#160; <a href=\"http:\/\/www.php.net\/socket_clear_error\"><span class=\"kw3\">socket_clear_error<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$socket<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n&#160; &#160; &#160; &#160; <span class=\"re0\">$socket_connected<\/span> <span class=\"sy0\">=<\/span> <span class=\"sy0\">@<\/span><a href=\"http:\/\/www.php.net\/socket_connect\"><span class=\"kw3\">socket_connect<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$socket<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$host<\/span><span class=\"sy0\">,<\/span> <span class=\"re0\">$port<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n&#160; &#160; &#160; &#160; <span class=\"re0\">$err<\/span> <span class=\"sy0\">=<\/span> <a href=\"http:\/\/www.php.net\/socket_last_error\"><span class=\"kw3\">socket_last_error<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$socket<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n&#160; &#160; &#160; &#160; <span class=\"re0\">$elapsed<\/span> <span class=\"sy0\">=<\/span> <span class=\"br0\">&#40;<\/span><a href=\"http:\/\/www.php.net\/microtime\"><span class=\"kw3\">microtime<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"kw4\">true<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">-<\/span> <span class=\"re0\">$now<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">*<\/span> <span class=\"nu0\">1000<\/span><span class=\"sy0\">;<\/span>\n&#160; &#160; <span class=\"br0\">&#125;<\/span>\n&#160; &#160; <span class=\"kw1\">while<\/span> <span class=\"br0\">&#40;<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$err<\/span> <span class=\"sy0\">===<\/span> <span class=\"nu0\">115<\/span> <span class=\"sy0\">||<\/span> <span class=\"re0\">$err<\/span> <span class=\"sy0\">===<\/span> <span class=\"nu0\">114<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">&amp;&amp;<\/span> <span class=\"re0\">$elapsed<\/span> <span class=\"sy0\">&lt;<\/span> <span class=\"re0\">$timeout<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n&#160;\n&#160; &#160; <span class=\"co4\">\/**<\/span>\n<span class=\"co4\">&#160; &#160; &#160;* For some reason, socket_connect can return true even when it is<\/span>\n<span class=\"co4\">&#160; &#160; &#160;* not connected. Make sure it returned true the last error is zero<\/span>\n<span class=\"co4\">&#160; &#160; &#160;*\/<\/span>\n&#160; &#160; <span class=\"re0\">$socket_connected<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$socket_connected<\/span> <span class=\"sy0\">&amp;&amp;<\/span> <span class=\"re0\">$err<\/span> <span class=\"sy0\">===<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">;<\/span>\n&#160;\n&#160; &#160; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$socket_connected<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span>\n&#160;\n&#160; &#160; &#160; &#160; <span class=\"co4\">\/**<\/span>\n<span class=\"co4\">&#160; &#160; &#160; &#160; &#160;* Set keep alive on so the other side does not drop us<\/span>\n<span class=\"co4\">&#160; &#160; &#160; &#160; &#160;*\/<\/span>\n&#160; &#160; &#160; &#160; <a href=\"http:\/\/www.php.net\/socket_set_option\"><span class=\"kw3\">socket_set_option<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$socket<\/span><span class=\"sy0\">,<\/span> SOL_SOCKET<span class=\"sy0\">,<\/span> SO_KEEPALIVE<span class=\"sy0\">,<\/span> <span class=\"nu0\">1<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n&#160;\n&#160; &#160; &#160; &#160; <span class=\"co4\">\/**<\/span>\n<span class=\"co4\">&#160; &#160; &#160; &#160; &#160;* set the real send\/receive timeouts here now that we are connected<\/span>\n<span class=\"co4\">&#160; &#160; &#160; &#160; &#160;*\/<\/span>\n&#160; &#160; &#160; &#160; <span class=\"re0\">$timeval<\/span> <span class=\"sy0\">=<\/span> <a href=\"http:\/\/www.php.net\/array\"><span class=\"kw3\">array<\/span><\/a><span class=\"br0\">&#40;<\/span>\n&#160; &#160; &#160; &#160; &#160; &#160; <span class=\"st0\">&quot;sec&quot;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"nu0\">0<\/span><span class=\"sy0\">,<\/span>\n&#160; &#160; &#160; &#160; &#160; &#160; <span class=\"st0\">&quot;usec&quot;<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"nu0\">0<\/span>\n&#160; &#160; &#160; &#160; <span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n&#160; &#160; &#160; &#160; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"re0\">$timeout<\/span> <span class=\"sy0\">&gt;=<\/span> <span class=\"nu0\">1000<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span>\n&#160; &#160; &#160; &#160; &#160; &#160; <span class=\"re0\">$ts_seconds<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$timeout<\/span> <span class=\"sy0\">\/<\/span> <span class=\"nu0\">1000<\/span><span class=\"sy0\">;<\/span>\n&#160; &#160; &#160; &#160; &#160; &#160; <span class=\"re0\">$timeval<\/span><span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;sec&quot;<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy0\">=<\/span> <a href=\"http:\/\/www.php.net\/floor\"><span class=\"kw3\">floor<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$ts_seconds<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n&#160; &#160; &#160; &#160; &#160; &#160; <span class=\"re0\">$timeval<\/span><span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;usec&quot;<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy0\">=<\/span> <span class=\"br0\">&#40;<\/span><span class=\"re0\">$ts_seconds<\/span> <span class=\"sy0\">-<\/span> <span class=\"re0\">$timeval<\/span><span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;sec&quot;<\/span><span class=\"br0\">&#93;<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">*<\/span> <span class=\"nu0\">1000000<\/span><span class=\"sy0\">;<\/span>\n&#160; &#160; &#160; &#160; <span class=\"br0\">&#125;<\/span> <span class=\"kw1\">else<\/span> <span class=\"br0\">&#123;<\/span>\n&#160; &#160; &#160; &#160; &#160; &#160; <span class=\"re0\">$timeval<\/span><span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;usec&quot;<\/span><span class=\"br0\">&#93;<\/span> <span class=\"sy0\">=<\/span> <span class=\"re0\">$timeout<\/span> <span class=\"sy0\">*<\/span> <span class=\"nu0\">1000<\/span><span class=\"sy0\">;<\/span>\n&#160; &#160; &#160; &#160; <span class=\"br0\">&#125;<\/span>\n&#160; &#160; &#160; &#160; <a href=\"http:\/\/www.php.net\/socket_set_option\"><span class=\"kw3\">socket_set_option<\/span><\/a><span class=\"br0\">&#40;<\/span>\n&#160; &#160; &#160; &#160; &#160; &#160; <span class=\"re0\">$socket<\/span><span class=\"sy0\">,<\/span>\n&#160; &#160; &#160; &#160; &#160; &#160; SOL_SOCKET<span class=\"sy0\">,<\/span>\n&#160; &#160; &#160; &#160; &#160; &#160; SO_SNDTIMEO<span class=\"sy0\">,<\/span>\n&#160; &#160; &#160; &#160; &#160; &#160; <span class=\"re0\">$timeval<\/span>\n&#160; &#160; &#160; &#160; <span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n&#160; &#160; &#160; &#160; <a href=\"http:\/\/www.php.net\/socket_set_option\"><span class=\"kw3\">socket_set_option<\/span><\/a><span class=\"br0\">&#40;<\/span>\n&#160; &#160; &#160; &#160; &#160; &#160; <span class=\"re0\">$socket<\/span><span class=\"sy0\">,<\/span>\n&#160; &#160; &#160; &#160; &#160; &#160; SOL_SOCKET<span class=\"sy0\">,<\/span>\n&#160; &#160; &#160; &#160; &#160; &#160; SO_RCVTIMEO<span class=\"sy0\">,<\/span>\n&#160; &#160; &#160; &#160; &#160; &#160; <span class=\"re0\">$timeval<\/span>\n&#160; &#160; &#160; &#160; <span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n&#160;\n&#160; &#160; <span class=\"br0\">&#125;<\/span> <span class=\"kw1\">else<\/span> <span class=\"br0\">&#123;<\/span>\n&#160;\n&#160; &#160; &#160; &#160; <span class=\"re0\">$elapsed<\/span> <span class=\"sy0\">=<\/span> <a href=\"http:\/\/www.php.net\/round\"><span class=\"kw3\">round<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$elapsed<\/span><span class=\"sy0\">,<\/span> <span class=\"nu0\">4<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n&#160;\n&#160; &#160; &#160; &#160; <span class=\"kw1\">if<\/span><span class=\"br0\">&#40;<\/span><span class=\"sy0\">!<\/span><a href=\"http:\/\/www.php.net\/is_null\"><span class=\"kw3\">is_null<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$err<\/span><span class=\"br0\">&#41;<\/span> <span class=\"sy0\">&amp;&amp;<\/span> <span class=\"re0\">$err<\/span> <span class=\"sy0\">!==<\/span> <span class=\"nu0\">0<\/span> <span class=\"sy0\">&amp;&amp;<\/span> <span class=\"re0\">$err<\/span> <span class=\"sy0\">!==<\/span> <span class=\"nu0\">114<\/span> <span class=\"sy0\">&amp;&amp;<\/span> <span class=\"re0\">$err<\/span> <span class=\"sy0\">!==<\/span> <span class=\"nu0\">115<\/span><span class=\"br0\">&#41;<\/span><span class=\"br0\">&#123;<\/span>\n&#160; &#160; &#160; &#160; &#160; &#160; <span class=\"re0\">$message<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;Failed to connect to <span class=\"es4\">$host<\/span>:<span class=\"es4\">$port<\/span>. (<span class=\"es4\">$err<\/span>: &quot;<\/span><span class=\"sy0\">.<\/span><a href=\"http:\/\/www.php.net\/socket_strerror\"><span class=\"kw3\">socket_strerror<\/span><\/a><span class=\"br0\">&#40;<\/span><span class=\"re0\">$err<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">.<\/span><span class=\"st0\">&quot;; after <span class=\"es4\">{$elapsed}<\/span>ms)&quot;<\/span><span class=\"sy0\">;<\/span>\n&#160; &#160; &#160; &#160; <span class=\"br0\">&#125;<\/span> <span class=\"kw1\">else<\/span> <span class=\"br0\">&#123;<\/span>\n&#160; &#160; &#160; &#160; &#160; &#160; <span class=\"re0\">$message<\/span> <span class=\"sy0\">=<\/span> <span class=\"st0\">&quot;Failed to connect to <span class=\"es4\">$host<\/span>:<span class=\"es4\">$port<\/span>. (timed out after <span class=\"es4\">{$elapsed}<\/span>ms)&quot;<\/span><span class=\"sy0\">;<\/span>\n&#160; &#160; &#160; &#160; <span class=\"br0\">&#125;<\/span>\n&#160;\n&#160; &#160; &#160; &#160; <span class=\"kw1\">throw<\/span> <span class=\"kw2\">new<\/span> Exception<span class=\"br0\">&#40;<\/span><span class=\"re0\">$message<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span>\n&#160;\n&#160; &#160; <span class=\"br0\">&#125;<\/span>\n&#160;\n&#160; &#160; <span class=\"kw1\">return<\/span> <span class=\"re0\">$socket<\/span><span class=\"sy0\">;<\/span>\n&#160;\n<span class=\"br0\">&#125;<\/span>\n&#160;<\/pre><\/td><\/tr><\/tbody><\/table><\/div>\n <\/div>\n <div class=\"phork-meta\">\n  <a href=\"https:\/\/p.cweiske.de\/632\/rev-raw\/b91da73dd7ccde3d7b93c1d698e94c66485567e9\/socket_connect_timeout.php\" style=\"float: right\">view raw source<\/a>\n  <a href=\"https:\/\/p.cweiske.de\/632#socket_connect_timeout.php\">socket_connect_timeout.php<\/a>\n <\/div>\n<\/div>\n<\/div>\n"}
