PHP fputs“等待”直到脚本结束

Posted

技术标签:

【中文标题】PHP fputs“等待”直到脚本结束【英文标题】:PHP fputs "waits" until the end of the script 【发布时间】:2015-12-14 15:37:01 【问题描述】:

目前我正在尝试开发一个 php 脚本,用作客户端/服务器应用程序的公开可用部分。 php 脚本应该用于使用一次性令牌对用户进行身份验证。

该应用程序的另一部分是一个 java 程序,它提供一个 telnet 套接字供其他应用程序连接。身份验证是通过这个 telnet 连接完成的。

java 部分已经在工作 - 但我仍然对 PHP 部分有很大的问题。

在 php 中,我已经打开了到 java 程序的 telnet 端口的连接,该连接到目前为止有效。初始化连接后,Java 程序等待 PHP 脚本的输入以验证用户身份。 身份验证过程完成后,它会向 PHP 脚本(或连接到其 telnet 服务器的任何其他程序)返回一个字符串,PHP 脚本应该输出该字符串。

在我解释我的问题之前,这是 PHP 脚本中实际通信发生的部分:

$tnconn = fsockopen("localhost", 53135, $errno, $errstr, 2);

if(!$tnconn) 
    echo "SERVER_UNAVAILABLE";
    die();
 else 
    $data = $p_ip." ".$p_name." ".$p_token;
    fputs($tnconn, $data);

    while (true) 
        if(($telnet_response = fgets($tnconn)) == false) 
            break;
        
    


echo $telnet_response;

似乎fputs() 语句在循环之后执行,即使它应该在它开始之前发生 - 否则 java 应用程序无法获取传递给 php 脚本的数据,但需要它来验证用户.

在收到数据后,telnet服务器会立即输出一个String来表示认证是否成功。

我尝试暂时删除循环,并且数据已成功通过fputs() 传递,所以我假设 php 等到整个脚本完成然后执行该函数。

如何让它在循环之前发送数据?

提前谢谢你。

【问题讨论】:

您是否需要在$data 的末尾发送CRCRLF 来通知telnet 服务器您已经发送了完整的数据序列?否则它可能坐在那里等待更多输入并且不发送任何内容?喜欢$data = $p_ip." ".$p_name." ".$p_token . "\n"; @drew010 非常感谢,这确实是问题所在。我根本没有意识到这一点,因为我已经习惯了 java 的 println 自动执行此操作。 很高兴,我会将其添加为答案,如果您不介意接受它,我将不胜感激。 【参考方案1】:

问题可能是您需要在数据字符串的末尾发送\n,以便远程登录服务器知道您已发送完整的数据序列。否则它很可能会坐在那里等待更多输入。

试试:

$data = $p_ip." ".$p_name." ".$p_token . "\n";

【讨论】:

以上是关于PHP fputs“等待”直到脚本结束的主要内容,如果未能解决你的问题,请参考以下文章

让我的php等待我的python脚本结束[重复]

带有睡眠循环的PHP直到循环结束才更新数据库

在 PHP 中,我将如何立即中止 HTTP 连接,不再发送数据包。客户端应继续等待,直到浏览器内部超时

使用脚本保持远程会话运行直到程序结束?

立即从cmd获取结果而无需等待执行python脚本结束[重复]

执行 PHP 循环直到数组结束或达到一定的迭代次数?