PHP 线程应该如何存储其数据?

2023-12-09

所以我一直在网上搜索和阅读有关 PHP pthreads3 以及它们应该如何存储数据的信息。 (或者更确切地说,他们不是) 在我看来,线程正确存储其数据的唯一方法是创建一个新的 Threaded 对象并将其发送到线程。然后,线程可以使用此 Threaded 对象来存储几乎任何数据。

我的问题,也是掌握 PHP 线程的最大问题: 是否可以让线程在需要时创建自己的存储对象? 我不知道如何或为什么,因为我找到的所有答案都告诉我们一个模糊的、详尽的和令人困惑的“也许,但不”,主要与性能不佳和内存问题/安全有关。 这似乎应该是可能的:

class someFantasticThread extends Thread {
    public $someData;

    function run(){
        while(true){
            //Create a fresh storage for the new data this iteration
            $this->someData = new SomeCoolStorage(); // Can this work somehow without all the issues?
            $this->someData[] = 'amazingdata'; // Do something amazing and store the new results in $someData
            $this->someData[] = new SomeCoolStorage(); // This would also be desireable, if it can somehow be done
            //don't mind the obvious loop issues. Imagine this is a well formed loop
        }
    }
}

class SomeCoolStorage extends Threaded{}

// Start the thread
$threadObj = new someFantasticThread();
$threadObj->start();
while(true){
    // at some point, retrieve the data and do something useful with the contained results
    // doSomethingAwesome($threadObj->someData);
}

在我看来,线程正确存储其数据的唯一方法是创建一个新的 Threaded 对象并将其发送到线程。

是的,这是一种方法。

是否可以让线程在需要时创建自己的存储对象?

是的,但前提是您在该线程(或它可能产生的任何子线程)中操作它。

在 PHP 中使用线程时需要理解的基本知识之一是:Threaded class 与创建它们的上下文相关联。这意味着如果您创建一个Threaded主线程中的对象,将此对象传递到生成的子线程中,然后加入该生成的子线程,然后您可以继续使用该对象Threaded对象正常。

示例1(构造函数注入):

<?php

$store = new Threaded(); // created in the main thread

$thread = new class($store) extends Thread {
    public $store;

    public function __construct(Threaded $store)
    {
        $this->store = $store;
    }

    public function run()
    {
        $this->store[] = 1;
        $this->store[] = 2;
    }
};

$thread->start() && $thread->join();

print_r($store); // continue using it in the main thread

这将输出:

Threaded Object
(
    [0] => 1
    [1] => 2
)

在上面的例子中,我们还可以创建Threaded构造函数内部的对象,然后执行var_dump($thread->store);在脚本的末尾。这是有效的,因为Threaded对象仍在需要它的最外层作用域中创建,因此它不依赖于任何可能已被销毁的子线程的作用域。 (a 的唯一部分Thread在 PHP 中,在单独的线程中执行的是Thread::run方法。)

与上面的示例类似,我们也可以使用 setter 注入。 (尽管如此,只要 setter 是由最外层范围内的线程调用的,在该范围内,Threaded将使用对象。)

许多刚接触 PHP 线程的开发人员似乎遇到的问题是,当他们创建一个Threaded从新线程内部获取对象,然后期望能够使用该对象Threaded当他们加入同一线程时对象。

Example:

<?php

$thread = new class() extends Thread {
    public $store;

    public function run()
    {
        $this->store = new Threaded(); // created inside of the child thread
        $this->store[] = 1;
        $this->store[] = 2;
    }
};

$thread->start() && $thread->join();

print_r($thread->store); // attempt to use it in the outer context (the main thread)

这将输出:

RuntimeException:pthreads 检测到连接到已在 %s:%d 中销毁的对象的尝试

这是因为Threaded对象在$thread->store当加入生成的子线程时已被销毁。这个问题也可能更加微妙。例如,在内部创建新数组Threaded对象会自动将它们转换为Volatile对象(也是Threaded对象)。

这意味着以下示例也将不起作用:

<?php

$thread = new class() extends Thread {
    public $store;

    public function run()
    {
        $this->store = [];
        $this->store[] = 1;
        $this->store[] = 2;
    }
};

$thread->start() && $thread->join();

print_r($thread->store);

Output:

RuntimeException:pthreads 检测到连接到已在 %s:%d 中销毁的对象的尝试

回到您的示例代码,您所做的绝对没问题,但前提是您不尝试使用$this->someData在该子线程之外。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP 线程应该如何存储其数据? 的相关文章

  • AJAX - 上传文件 (HTML5) 和 PHP

    我感觉完全超出了我的深度 但我感觉很接近 我正在尝试使用 AJAX 上传文件 我找到了这个教程http blog new bamboo co uk 2010 7 30 html5 powered ajax file uploads http
  • 我无法访问 XAMPP phpMyAdmin;它说:错误 MySQL 说:文档无法连接:无效设置

    完整错误消息 Error MySQL said Documentation Cannot connect invalid settings Connection for controluser as defined in your conf
  • 如何在代码输出中显示 PHP 错误?

    当通过浏览器执行PHP页面时 我们只会得到输出 但不会得到代码中的错误 如何查看后端代码发生的错误 我在代码中使用以下内容进行错误报告 error reporting E ALL E ALL ini set display errors 1
  • Ajax 调用 contentType: 'application/json' 不起作用

    我有一个 ajax 调用 它将表单数据发送到 php 函数 因为我读了很多使用contentType application json 这是最佳实践 我也想尝试一下 但不幸的是 我的脚本在使用时没有返回任何内容 如果我删除它 脚本就会执行它
  • Shift+Enter 按钮用于提交表单

    我想使用 Shift Enter 按钮提交表单 而不是简单地按 Enter 按钮 请帮助我 如果您仍然想这样做 尽管这会带来可用性问题 form keydown function e if e keyCode 13 e shiftKey W
  • 将 bcrypt 密码哈希从 PHP 迁移到 Python - ValueError:无效的 hashed_pa​​ssword salt

    我有一个 PHP7 应用程序 它可以像这样对用户密码进行哈希处理 hash password hash password PASSWORD BCRYPT 例如 如果我通过test1234为此 我有 2y 10 aazE9OUKZlOQiM6
  • PHP 联系表单未提交

    您好 我之前曾成功使用过这个非常简单的 php 联系脚本 但当我尝试在新的 HTML 页面上实现它时 表单不会提交 任何人都可以看到任何明显的错误吗 任何帮助将非常感激 这是表单的 html div div
  • phpstorm 和 xdebug 之间的连接

    我配置了 phpstorm xdebug 并且能够使用断点调试我的代码 这些天我更新了 php 通过brew 和 xdebug 现在我有 php 5 5 26 和 xdebug 2 3 3 当我尝试调试测试 和代码 时 phpstorm 告
  • 服务容器的使用寿命是多少?

    我正在尝试了解 Symfony2 框架 来自 Java Spring 背景 我意识到 Symfony2 中的 Scope 与 Spring 中的 Scope 不同 此外 通过 Symfony3 范围已弃用 https stackoverfl
  • PHP 中“或”的奇怪用法

    PHP s or是一个奇怪的关键字 这是一个让我感到困惑的代码片段 echo 0 or 1 prints 1 foo 0 or 1 echo foo prints 1 foo 0 or 1 echo foo prints 0 for som
  • 调用 Thread.start() 时,happens-before 是否具有传递性?

    假设我们有一堂课 class Foo int x Foo x 5 和一些客户端代码 public static void main String args Foo foo new Foo new Thread gt while true n
  • 尝试使用 PHP GD 以固定宽度/高度生成按比例裁剪的缩略图

    我正在尝试使用 GD 在 PHP 中创建一个缩略图生成器 它将获取图像并将其缩小到固定的宽度 高度 它从原始图像中获取的正方形 基于我的固定宽度 高度 将来自图像的中心 以给出比例正确的缩略图 我将尝试用一些漂亮的 ASCII 来演示这个令
  • 如何复制具有 MySQL 中保留的键和其他结构特征的表?

    如何复制保留键和其他结构特征的表 包括主键 外键和索引 这可以通过单个 MySQL 查询来完成吗 我正在使用 create table newtable as select 但此方法会使所有键和索引丢失 无法使用单个查询来从另一个表复制一个
  • Wordpress 编辑器中的“application/gas-events-abn”对象是什么?

    我正在使用 Wordpress 创建博客 我注意到当我多次保存帖子时 代码中会出现一个奇怪的元素 在帖子底部创建一个大的空白区域 代码如下所示 post content nbsp 每次我编辑帖子时 我都必须将其删除 Joomla 有时也会发
  • Preg_split 用逗号,忽略括号,PHP

    我必须分割一个字符串 并且我想避免用括号内的逗号分割它 那么我该如何实现呢 Example string string1 sString1 sString2 ssString1 ssString2 string2 string3 resul
  • PHP字符串比较和相似度索引

    在 PHP 中 有什么优雅的代码可以在两个字符串中查找公共字母而不包含空格 还返回相似性索引 即计算常见字符的数量并返回占字符总数的百分比 假设我有一个字符串 LEGENDARY 而其他字符串为 BARNEY STINSON 所以我需要找到
  • JSON 编码和大引号

    我在 PHP 5 的本机实现中遇到了一个有趣的行为json encode 显然 当将对象序列化为 json 字符串时 编码器将清空包含 卷曲 引号的字符串的任何属性 这种类型可能会在启用自动转换的情况下从 MS Word 文档中复制粘贴 这
  • 字符串不等于其自身

    But why if i echo good else echo bad echos gt gt bad 您应该复制此片段 如果你手写的话 它会起作用 它让我疯狂 你太狡猾了 第二个 I 不是小写拉丁文小写 i 我把它转储了 hexdump
  • Elasticsearch 如何使用通配符进行 OR 查询

    我很难尝试使用 elasticsearch 构建查询 我想查询类似的内容 WHERE field 1 is match string OR field 2 is wildcard match string OR field 3 is fuz
  • Codeigniter,为MySQL创建表和用户

    我想以编程方式使用 CI 创建数据库和用户 到目前为止 我有这 2 个简单的 MySQL 语句 CREATE DATABASE testdb DEFAULT CHARACTER SET utf8 COLLATE utf8 general c

随机推荐

  • 背景大小:涵盖性能问题

    我在使用大量元素时遇到性能问题 尤其是在 Safari 中 background size cover 我已经添加transform translate3d 0 0 0 这确实有一点帮助 但没有我想要的那么多 如果可能的话 我真的在寻找纯C
  • python argparse 当使用特定选项时忽略其他选项

    我正在编写一个 python 程序 我希望有一个以特定方式运行的命令行界面 命令行界面应接受以下调用 my prog test svg foo my prog font Sans test svg foo 它将生成一个带有单词的 svgfo
  • Lollipop 5.0.2 中 WIFI/3G/4G 位置返回 0.0

    我正在尝试根据以下内容获取位置WiFi 3G 4G连接但总是返回0 0 as latitude and longitude 如果使用相同的代码GPS ON然后它就可以工作了 所以从 4 4 开始有些东西发生了变化 还尝试了以下链接 但它也不
  • 如何在 helm 图表中使用值文件传递文件?

    我想将证书传递给舵图 目前我正在使用 set file global dbValues dbcacertificate server crt 传递证书 但我想传递舵图值文件中的文件 Values yaml 文件读取 global dbVal
  • WPF 中将窗口锚定到屏幕边缘

    我决定通过在 Visual Studio 2010 中编写一个音乐播放器来自学 C 我选择了 WPF 因为据我所知 它听起来像是一个很好的皮肤基础 我想对我的窗口进行编程 使其具有以下行为 如果窗口到达屏幕边缘 10 像素左右 它将捕捉到屏
  • Adobe Air Javascript API [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 好吧 我觉得这是一个愚蠢的问题 但我在 Google 上确实找不到 Adob e AIR Javascript 的 API 我正在尝试访问文件系统和
  • Android 构建 apk 更改原始 png 文件

    最近 我从 SDK Tools r11 升级到 SDK Tools r16 后 某些设备出现了问题 我发现它与纹理相关 现在回顾我使用 SDK Tools r11 创建的 APK 文件 其中包含原始文件中纹理的精确副本 但是使用 SDK T
  • 在自定义 ArrayList 中仅添加一次项目

    我已经制作了自己的自定义 ArrayList 如下所示 public class Points String hoodName Double points Integer hoodId public Points String hN Dou
  • 在 R 中使用附加变量创建边列表

    我有这样的数据 ID c rep ID1 3 rep ID2 2 ID3 rep ID4 2 sex c rep male 3 rep female 2 female rep male 2 item c a b c a c a b a df
  • 无法创建 Facebook 应用程序

    第一次尝试创建 Facebook 应用程序 浏览到https developers facebook com apps它有一个在创建链接之前注册的链接 您只需接受条款和条件即可 现在它说 创建一个应用程序来启动 但是没有按钮可以单击来创建应
  • 专门使用 Github actions 为 iOS 构建 swift 包

    我有 iOS 应用程序的 swift 包 它需要UIKit跑步 我不想使用 Github 操作构建这个包 这就是我的工作流程 name Swift on push branches main pull request branches ma
  • 如何在 MVC 3 中将 WebForms .ascx 显示为部分视图

    我正在构建一个新的 ASP NET MVC 3 应用程序 在此应用程序中 我想在我的新 MVC razor 应用程序中的覆盖层中显示旧的 WebForms 用户控件 ascx ascx cs 作为部分视图 我在网上找不到任何有关执行此操作的
  • 静态链接与动态链接

    在某些情况下 是否有任何令人信服的性能原因来选择静态链接而不是动态链接 反之亦然 我听过或读过以下内容 但我对这个主题的了解还不够 无法保证其真实性 1 静态链接和动态链接之间的运行时性能差异通常可以忽略不计 2 如果使用使用配置文件数据来
  • 为什么我的打印函数将 () 和 "" 与语句一起打印?

    这是我针对绝对初学者 Python 编程挑战的代码 food input What is your favorite entree dessert input What is your favorite dessert print nI a
  • 使用可变模板参数构建枚举

    我有一个相当简单的变体类 它支持一组预定义的类型 并提供一个枚举来指示哪些可用类型当前处于活动状态 像这样的事情 class variant enum class type integer real string etc type acti
  • Eclipse 2023-06 突然不再自动完成“sysout”

    虽然我认识到这个问题之前已经被问过 但我尝试了多个不同线程的解决方案 但到目前为止还没有解决方案 5 天前 当我使用 Eclipse 时 我没有任何问题 现在到今天我突然无法使用 ctrl space 自动完成 sysout 据我所知 Ec
  • 在 C 中将数组作为参数传递

    我 认为我 明白 如果数组是在编译时在堆栈上声明的 则只能检索数组的大小 使用 sizeof 例如 int my array 1 2 3 sizeof my array 3 一旦你开始使用指针 你就会失去这个长度信息 例如如果将 int 指
  • 如何在 Spring RestTemplate 中使用以 JSON 表示的查询参数?

    我需要使用 Spring RestTemplate 向具有表示为 JSON 的查询参数的 HTTP 端点发出请求 restTemplate getForObject apiRoot path object myObject Response
  • 当 DateTime 字段为 null 时,LINQ 中“指定的转换无效”

    我遇到问题了 我的代码使用 LINQ var resultCases from row2 in dtCases AsEnumerable where row2 Field
  • PHP 线程应该如何存储其数据?

    所以我一直在网上搜索和阅读有关 PHP pthreads3 以及它们应该如何存储数据的信息 或者更确切地说 他们不是 在我看来 线程正确存储其数据的唯一方法是创建一个新的 Threaded 对象并将其发送到线程 然后 线程可以使用此 Thr