【问题标题】:Creating a simple socket创建一个简单的套接字
【发布时间】:2020-08-27 11:19:48
【问题描述】:

我对 PHP 套接字完全陌生,我现在将它们用于一个简单的目的:我想在 Cron Job 和网络之间传递信息,因为我的主机阻止我使用putenv,这是我找到的最佳解决方案。

阅读official documentation,这是我尝试做的:

$host = "localhost"; //or ssl://mydomain.com
$socket = fsockopen($host, 80, $no, $err,0);
if(!$err)
{
    var_dump(fputs($socket, "random text"));
    var_dump(filesize($socket));
    var_dump(fgets($socket, filesize($socket)));
    fclose($socket);
}

这是我得到的输出:

int(3)
NULL
bool(false)

所以看起来fput 成功了,但由于某种原因它实际上并没有写任何东西(fwritefread 的结果相同。


更新:

对于任何对此感兴趣的人,我发现 another solution 使用 a completely different approach

现在我只需要测试一下;如果它由于任何原因不起作用,我将继续使用 peakle 的解决方案

【问题讨论】:

  • 您为什么期望filesize() 返回对套接字有意义的东西?毕竟,套接字不是文件。
  • @PresidentJamesMoveonPolk 甚至写 11 itfgets() 返回false
  • 您似乎将套接字与文件混淆了。套接字是连接的一半。当你有一个连接的套接字时,你写的任何东西都只能在连接的另一端读取,而不是同一端。同样,您可以读取的唯一数据是从另一端发送的数据。
  • @PresidentJamesMoveonPolk 我需要帮助来了解如何实现另一端,以及在两次 cronjobs 之间将这些数据保存在哪里
  • 只需将其存储在文件中即可。

标签: php sockets cron port fwrite


【解决方案1】:

您的脚本有一些错误,例如:fsockopen 中的零超时,将resource 提供给filesize 函数,我修复了一些错误,如果您在localhost 域上的服务器工作正常,它将输出正确的响应:

<?php
$host = 'localhost';
$socket = fsockopen($host, 80, $no, $err, 30);

if (!$err) {
    var_dump(fputs($socket, "random text"));

    while (!feof($socket)) {
        echo fgets($socket, 4096);
    }

    fclose($socket);
}

:)

【讨论】:

  • 它仍然无法正常工作。 fgets 不断返回 false
  • @Foxel 你想在没有网络服务器的某些进程之间使用套接字进行通信吗?还是为了什么?因为我写了使用网络服务器的解决方案:) 如果首先你想使用putenv 也许是最好的解决方案,更简单的是使用写入文件?因为使用套接字它非常复杂的区域
  • 我有一个网络服务器(XAMPP 的 localhost 和我的托管服务中的域),我更喜欢一个套接字,因为创建一个空白文件只是为了存储一行数据似乎是一个非有效的解决方案对我来说
  • @Foxel 带有套接字解决方案的示例:php.net/manual/en/function.socket-create.php#108535,由于套接字的复杂性,我强烈推荐您使用 dotenv for php:github.com/vlucas/phpdotenv,我认为这将是解决您的问题的好选择
  • 我的主机服务已禁用putenv,这个库还能正常工作吗?
猜你喜欢
  • 1970-01-01
  • 2016-11-07
  • 2016-07-03
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多