Windows 10 &引用;shmop_open():无法附加或创建共享内存段';无错误';:&引用;?

Windows 10 &引用;shmop_open():无法附加或创建共享内存段';无错误';:&引用;?,windows-10,php,Windows 10,Php,每次我试图创建一个帐户来询问堆栈溢出问题时,我都会遇到这样的问题: 哎呀!糟糕的事情发生了 对于给您带来的不便,我们深表歉意,但您在浏览我们的网站时发生了意外错误 不是你,是我们。这是我们的错 这就是我把它贴在这里的原因。我真的不能在溢出时问它,即使在我一天中花费数小时(断断续续)重复我的尝试并解决了一百万个reCAPTCHA难题之后。你能很快纠正这个错误吗 由于没有任何有意义/完整的示例,基本上也没有任何文档,多年来我一直在尝试使用PHP的“shmop”部分。现在,我必须找到一种方法,在同一

每次我试图创建一个帐户来询问堆栈溢出问题时,我都会遇到这样的问题:

哎呀!糟糕的事情发生了

对于给您带来的不便,我们深表歉意,但您在浏览我们的网站时发生了意外错误

不是你,是我们。这是我们的错

这就是我把它贴在这里的原因。我真的不能在溢出时问它,即使在我一天中花费数小时(断断续续)重复我的尝试并解决了一百万个reCAPTCHA难题之后。你能很快纠正这个错误吗


由于没有任何有意义/完整的示例,基本上也没有任何文档,多年来我一直在尝试使用PHP的“shmop”部分。现在,我必须找到一种方法,在同一台机器上运行的两个不同的CLI PHP脚本之间发送数据,而不必为此滥用数据库。它必须在没有数据库支持的情况下工作,这意味着我正在尝试使用shmop,但它根本不起作用:

$shmopid = shmop_open(1, 'w', 0644, 99999); // I have no idea what the "key" is supposed to be. It says: "System's id for the shared memory block. Can be passed as a decimal or hex.", so I've given it a 1 and also tried with 123. It gave an error when I set the size to 64, so I increased it to 99999. That's when the error changed to the one I now face above.
shmop_write($shmopid, 'meow 123', 0); // Write "meow 123" to the shared variable.

while (1)
{
    $shared_string = shmop_read($shmopid, 0, 8); // Read the "meow 123", even though it's the same script right now (since this is an example and minimal test).
    var_dump($shared_string);
    sleep(1);
}
我得到第一行的错误:

shmop_open(): unable to attach or create shared memory segment 'No error':
这是什么意思?我做错了什么?为什么这本手册如此神秘?为什么这不只是一个可以跨脚本访问的内置“superarray”?

关于CLI: 它不能在独立的CLI进程中工作,这里的答案是:

主进程是保存共享内存块的进程,因此您必须使用
php fpm
mod_php
或其他运行web/服务的版本,甚至可能从CLI php脚本启动/请求/停止所有进程

关于shmop使用本身: 使用
shmop_open()
中的“c”模式创建段,然后再将其与“a”或“w”一起使用

我在另一个场景中偶然发现了这个错误,共享内存是完全可选的,可以加速一些重复的操作。所以我想先尝试在不知道内存大小的情况下读取,然后在需要时从实际数据中进行分配。在我的例子中,我不得不将其称为
@shmop\u open()
,以隐藏此错误输出

关于Windows上的shmop: PHP 7使Apache worker进程崩溃,在尝试重新分配具有相同预定义(任意数字)键但大小不同的段(即使在
shmop_delete()
之后)时导致其重新启动,状态为322225477。作为一种解决方法,我使用包含要存储在内存中的数据的源文件的
filemtime()
,并使用该时间戳作为
shmop\u open()
中的键。它仍然不是完美无缺的IIRC,我不知道它是否会导致内存泄漏,但它足以测试我的代码,而我的代码主要运行在Linux上

最后,从PHP版本8.0.7开始,shmop似乎可以在Windows 10中与Apache 2.4.46和
mod_PHP
配合使用。

关于CLI: 它不能在独立的CLI进程中工作,这里的答案是:

主进程是保存共享内存块的进程,因此您必须使用
php fpm
mod_php
或其他运行web/服务的版本,甚至可能从CLI php脚本启动/请求/停止所有进程

关于shmop使用本身: 使用
shmop_open()
中的“c”模式创建段,然后再将其与“a”或“w”一起使用

我在另一个场景中偶然发现了这个错误,共享内存是完全可选的,可以加速一些重复的操作。所以我想先尝试在不知道内存大小的情况下读取,然后在需要时从实际数据中进行分配。在我的例子中,我不得不将其称为
@shmop\u open()
,以隐藏此错误输出

关于Windows上的shmop: PHP 7使Apache worker进程崩溃,在尝试重新分配具有相同预定义(任意数字)键但大小不同的段(即使在
shmop_delete()
之后)时导致其重新启动,状态为322225477。作为一种解决方法,我使用包含要存储在内存中的数据的源文件的
filemtime()
,并使用该时间戳作为
shmop\u open()
中的键。它仍然不是完美无缺的IIRC,我不知道它是否会导致内存泄漏,但它足以测试我的代码,而我的代码主要运行在Linux上


最后,从PHP版本8.0.7开始,shmop似乎可以在Windows 10中与Apache 2.4.46和
mod_PHP
配合使用。

虽然我对您的SO问题表示同情,但这个问题不在这里讨论。我会尝试SO中的联系链接,看看你是否能修复你原来的问题。虽然我同情你的SO问题,但这个问题不在这里。我会在SO中尝试联系链接,看看您是否可以修复原始问题。