【问题标题】:Telnet commands via PHP - extremely long execution time problem, using PHPTelnet classTelnet 命令通过 PHP - 极长的执行时间问题,使用 PHPTelnet 类
【发布时间】:2011-05-15 20:35:24
【问题描述】:

我需要自动化我们系统的几个功能,遗憾的是这些功能没有 API,只有 telnet 命令。

所以,我发现了这个:http://www.geckotribe.com/php-telnet/,它本质上是 PHP 的 Telnet 类。

起初我遇到了奇怪的问题,因为它尝试登录太快,所以我在连接之间添加了额外的 sleep(2),并输入了用户名和密码。

现在的问题:似乎,在执行一个只输出单行的命令后,下一个(多行输出)将系统挂起 2 分 15 秒(在 Eclipse 调试模式下) , 到浏览器加载时的 1 分 20 秒(仅在我将超时设置为 180 秒后...)。

它发生的那一行是:$r.=fread($this->fp,1000);在类的 DoCommand() 函数中。

这是我尝试执行的脚本的 pastebin 链接,以及我最终得到的输出(经过修改以保护信息..)

代码:http://pastebin.com/TXEHWa05

输出:http://pastebin.com/mVFm5HM2

任何想法如何调试这个原因?到目前为止,我的项目中甚至不需要调试器:( 理想情况下,我希望最多在 5 秒内完成在 telnet 上执行 2-3 个命令。不要更多。 (因为一旦我们弄清楚这一点,我将添加断开用户连接等功能。

我希望对使用 fsockopen 的这种 PHP 用法有更多经验的人可以提供帮助:)

【问题讨论】:

    标签: php telnet fsockopen


    【解决方案1】:

    此调用调用的循环一次读取 1000 个字节的数据,直到它接收到所有数据。 socket_get_status 调用可能总是返回 'unread_bytes' 的值,并且这只是循环,直到您的强制超时调用。另一端的服务可能正在返回一个相当大的响应,在这种情况下,您可以在每次挂机时将字节读取长度增加 1000,直到找到合适的数字。此外,通过 var_dump() 每次都将 fread 和 socket_get_status 的结果进行一些调试,看看它挂在哪里。

    【讨论】:

    • 谢谢!我将它增加到 8192,现在它可以了,尽管完成整个程序仍然需要 6-10 秒。
    • 这个值是什么意思?我的意思是,我理解这意味着要读取多少个字符,但它真的需要吗?在我看来,它带来的麻烦多于它的价值。有没有办法绕过它?确保有一天它不会卡在 8193 个字符上......
    猜你喜欢
    • 2012-01-14
    • 1970-01-01
    • 2015-10-30
    • 2016-03-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    相关资源
    最近更新 更多