Lors de la programmation des réseaux utilisant PHP, Stream_Set_Timeout est une fonction très utile qui nous permet de définir le délai d'expiration du flux. Cependant, dans certains cas, les développeurs constateront que bien que nous définissions le délai d'attente via stream_set_timeout , les opérations de réseau ne semblent pas être chronométrées au moment prévu et peuvent même être confrontés. L'occurrence de ce phénomène est souvent liée au paramètre de délai d'expiration de socket par défaut dans PHP.
La fonction Stream_Set_timeout est utilisée pour définir le délai d'expiration d'un flux (comme un fichier, une prise, etc.). Grâce à cette fonction, les développeurs peuvent spécifier le temps d'attente maximal pour le flux. En règle générale, le délai d'attente est destiné à une opération de lecture ou à une opération d'écriture. Si l'opération n'est pas terminée dans le délai d'exécution, PHP déclenchera le mécanisme de temps mort et reviendra faux .
<span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_client</span></span><span>(</span><span><span class="hljs-string">"tcp://example.com:80"</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, </span><span><span class="hljs-number">30</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$socket</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Échec de la connexion: <span class="hljs-subst">$errstr</span></span></span><span> (</span><span><span class="hljs-subst">$errno</span></span><span>)";
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-title function_ invoke__">stream_set_timeout</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">5</span></span><span>); </span><span><span class="hljs-comment">// Réglez le temps de temps d'expiration pour 5 Deuxième</span></span><span>
</span><span><span class="hljs-comment">// Opération supplémentaire</span></span><span>
}
</span></span>Dans le code ci-dessus, Stream_Set_timeout ($ socket, 5) définit le délai de temps mort du somber à 5 secondes. Ce qui signifie que si aucune opération de lecture ou d'écriture valide n'est effectuée dans les 5 secondes, le flux sera considéré comme un délai d'attente.
Cependant, Stream_Set_timeout ne peut modifier le paramètre du délai d'expiration du flux, mais il a une influence mutuelle avec le paramètre de délai de délai de socket par défaut de PHP (généralement déterminé par la directive de configuration default_socket_timeout ). Default_socket_timeout est un paramètre dans le fichier de configuration PHP qui définit le délai d'expiration par défaut pour toutes les opérations de socket. Cette valeur par défaut est utilisée si le délai d'expiration n'est pas explicitement défini.
<span><span><span class="hljs-comment">; php.ini Valeur par défaut dans le fichier</span></span><span>
</span><span><span class="hljs-attr">default_socket_timeout</span></span><span> = </span><span><span class="hljs-number">60</span></span><span>
</span></span>Si vous n'avez pas modifié default_socket_timeout , la valeur par défaut est de 60 secondes. Dans ce cas, PHP utilisera ce délai d'expiration global pour gérer toutes les opérations de socket, même si vous définissez un délai d'attente différent via Stream_Set_timeout . Si l'opération de flux n'est pas terminée dans le délai spécifié, Default_Socket_timeout peut remplacer le paramètre Stream_Set_timeout , provoquant un comportement anormal du programme.
Il y aura un conflit entre le délai d'expiration défini par Stream_Set_timeout et le délai de délai de défaut_socket_timeout , car le fonctionnement du socket de PHP définit en fait la configuration de socket sous-jacente via socket_set_option () . Stream_set_timeout est utilisé pour définir le délai d'attente via le flux, tandis que le paramètre de délai d'expiration de socket par défaut est global.
Dans certains cas, Stream_Set_Timeout peut modifier avec succès le délai d'expiration du flux, mais si default_socket_timeout est défini sur plus longtemps que Stream_Set_Timeout , PHP peut utiliser la valeur de délai d'expiration configurée globalement lors de l'appel en interne socket_set_option , ce qui fait que le paramètre de Stream_Set_Timeout est invalidé en interne.
Pour éviter ce conflit, la meilleure façon est d'assurer la cohérence entre les paramètres default_socket_timeout et stream_set_timeout . Vous pouvez prendre les méthodes suivantes:
Ajustez la configuration default_socket_timeout <br> Assurez-vous que le fichier de configuration default_socket_timeout dans le fichier de configuration php.ini est cohérent avec le Stream_Set_timeout que vous définissez dans votre code. Si vous souhaitez utiliser un temps mort plus court, vous pouvez définir sa valeur sur une valeur plus petite dans php.ini .
<span><span><span class="hljs-attr">default_socket_timeout</span></span><span> = </span><span><span class="hljs-number">5</span></span><span>
</span></span>Définir explicitement le délai d'expiration <br> Chaque fois que vous utilisez Stream_Socket_Client () ou d'autres opérations de streaming de réseau, appelez explicitement Stream_Set_timeout () pour vous assurer que le délai d'attente est précis.
<span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_client</span></span><span>(</span><span><span class="hljs-string">"tcp://example.com:80"</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, </span><span><span class="hljs-number">30</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$socket</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Échec de la connexion: <span class="hljs-subst">$errstr</span></span></span><span> (</span><span><span class="hljs-subst">$errno</span></span><span>)";
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-title function_ invoke__">stream_set_timeout</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">5</span></span><span>); </span><span><span class="hljs-comment">// Assurez-vous que le délai d'attente est 5 Deuxième</span></span><span>
</span><span><span class="hljs-comment">// Opération supplémentaire</span></span><span>
}
</span></span>Utilisez stream_context_create pour configurer le délai d'expiration du flux <br> Une autre façon consiste à créer un contexte de flux via stream_context_create et à définir un délai d'expiration dans le contexte. Cela définit non seulement le délai d'expiration du socket, mais gère également d'autres configurations liées au flux.
<span><span><span class="hljs-variable">$context</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_context_create</span></span><span>([
</span><span><span class="hljs-string">'socket'</span></span><span> => [
</span><span><span class="hljs-string">'timeout'</span></span><span> => </span><span><span class="hljs-number">5</span></span><span>
]
]);
</span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_client</span></span><span>(</span><span><span class="hljs-string">"tcp://example.com:80"</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, </span><span><span class="hljs-number">30</span></span><span>, STREAM_CLIENT_CONNECT, </span><span><span class="hljs-variable">$context</span></span><span>);
</span></span>Grâce à ces méthodes, vous pouvez vous assurer que le délai d'expiration défini par Stream_Set_timeout n'entre pas avec le délai d'expiration du socket par défaut PHP, évitant ainsi le comportement du programme incohérent.
Stream_set_timeout est une fonction puissante pour définir le délai d'expiration d'un flux en PHP. Mais lorsque vous l'utilisez, nous devons faire attention au paramètre de délai d'expiration de socket par défaut de PHP ( default_socket_timeout ) car cela peut affecter le comportement de délai d'expiration du flux. En ajustant le fichier default_socket_timeout dans le fichier de configuration ou en définissant explicitement le délai d'attente dans le code, nous pouvons éviter ces conflits et nous assurer que les opérations réseau peuvent être effectuées au délai attendu.