MySQL 代码导致 PHP 脚本在 popen/exec 处崩溃

2023-12-10

我有以下内容PHP 5.6.19上的代码Ubuntu 14.04服务器。这段代码只是连接到一个MySQL 5.6.28数据库,等待一分钟,启动其自身的另一个进程,然后退出。

注意:这是完整的脚本,其目的是演示问题 - 它没有做任何有用的事情。

class DatabaseConnector {
    const DB_HOST = 'localhost';
    const DB_NAME = 'database1';
    const DB_USERNAME = 'root';
    const DB_PASSWORD = 'password';

    public static $db;

    public static function Init() {
        if (DatabaseConnector::$db === null) {
            DatabaseConnector::$db = new PDO('mysql:host=' . DatabaseConnector::DB_HOST . ';dbname=' . DatabaseConnector::DB_NAME . ';charset=utf8', DatabaseConnector::DB_USERNAME, DatabaseConnector::DB_PASSWORD);
        }
    }
}

$startTime = time();

// ***** Script works fine if this line is removed.
DatabaseConnector::Init();

while (true) {
    // Sleep for 100 ms.
    usleep(100000);

    if (time() - $startTime > 60) {
        $filePath = __FILE__;
        $cmd = "nohup php $filePath > /tmp/1.log 2>&1 &";

        // ***** Script sometimes exits here without opening the process and without errors.
        $p = popen($cmd, 'r');

        pclose($p);

        exit;
    }
}

我使用以下命令启动脚本的第一个进程nohup php myscript.php > /tmp/1.log 2>&1 &.

这个进程循环应该永远持续下去,但是......基于多次测试,在一天之内(但不是立即),服务器上的进程无缘无故地“消失”。我发现MySQL代码导致popen代码失败(脚本退出,没有任何错误或输出)。

这里发生了什么?


Notes

  • 服务器 24/7 运行。
  • 内存不是问题。
  • 数据库连接正确。
  • 文件路径不包含空格。
  • 使用时也存在同样的问题shell_exec or exec代替popen (and pclose).

我也知道popen是失败的行,因为我通过在脚本中的某些点记录到文件来进行进一步的调试(上面未显示)。


fork之后父进程肯定退出吗?我以为pclose会等孩子出去再回来。

如果它没有退出,我推测因为 mySQL 连接永远不会关闭,所以当您生成子进程树时,您最终会达到其连接限制(或其他一些限制)。

Edit 1

我只是尝试复制这个。我将你的脚本修改为每半秒而不是每分钟 fork 一次,并且能够在大约 10 分钟内杀死它。

看起来子进程的重复创建正在生成越来越多的 FD,直到最终不再有:

$ lsof | grep type=STREAM | wc -l
240
$ lsof | grep type=STREAM | wc -l
242
...
$ lsof | grep type=STREAM | wc -l
425
$ lsof | grep type=STREAM | wc -l
428
...

这是因为子进程在分叉时继承了父进程的 FD(在本例中为 mySQL 连接)。

如果之前关闭了mySQL连接popen与(在你的情况下):

DatabaseConnector::$db = null;

问题有望消失。

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

MySQL 代码导致 PHP 脚本在 popen/exec 处崩溃 的相关文章

  • 适用于 Linux 的轻量级 IDE [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何将ElasticSearch与MySQL集成?

    在我的一个项目中 我计划将 ElasticSearch 与 MySQL 结合使用 我已经成功安装ElasticSearch 我可以单独管理ES中的索引 但我不知道如何用 MySQL 实现同样的功能 我读过一些文件 但我有点困惑 没有明确的想
  • MySQL 查询到 CSV [重复]

    这个问题在这里已经有答案了 有没有一种简单的方法来运行MySQL查询来自linux命令行并以csv格式输出结果 这就是我现在正在做的事情 mysql u uid ppwd D dbname lt lt EOQ sed e s g tee l
  • 调用 printf 系统子例程在汇编代码中输出整数错误[重复]

    这个问题在这里已经有答案了 来回 在windows7控制台窗口中运行gcc s2 asm 然后生成一个exe文件 运行a exe 然后崩溃 为什么 s2 asm 代码由以下源代码生成 int m m 1 iprint m s2 asm请参考
  • 如何将表中不存在但原始SQL中存在的实体字段设置为别名?

    假设我们有一个这样的查询 SELECT CUSTOM EXPRESSION as virtualfield FROM users 用户的实体本身具有 虚拟字段 但映射注释没有 因为表没有该字段 假设它作为原始 SQL 执行 我们如何使用上面
  • 在 foreach 中使用 QueryPath 的多个查找

    我正在使用 QueryPath 和 PHP 这发现 eventdate 没问题 但不会为 dtstart 返回任何内容 qp htmlqp url foreach qp gt find table schedule gt find tr a
  • Nginx 502 网关错误。通过增加buffer来解决。为什么?

    我正在设置 LEMP 堆栈来运行 Drupal 我安装了 Nginx 和 PHP FastCGI Nginx 工作正常 但任何运行 PHP 的尝试都会出现错误 502 Bad Gateway 谷歌很快发现 nginx 502 错误网关 ht
  • 使用 PHP 从 Mongo 解码 JSON

    我已经看过这个线程 PHP 解码嵌套 JSON https stackoverflow com questions 3555335 php decode nested json并没有设法用它来解决我的问题 我目前正在从 Mongo 获取 J
  • 带倒计时的php循环

    假设我从 400 开始计数器 我将如何执行一个向后运行直到 0 的 foreach 循环 伪代码 i 400 foreach SOMETHING do stuff i for i 400 i gt 0 i do stuff 其他方法 i 4
  • 安装 scrapy 0.22 时出错(在 Ubuntu 12.04 上):“gcc”失败,退出状态为 1

    尝试使用 pip 从命令行安装 Scrapy 时 sudo pip install scrapy我收到以下错误 error command gcc failed with exit status 1 查看错误输出中的几行 我发现在尝试安装
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • 一次从多个表中删除行

    我正在尝试将 2 个查询合并为一个这样的查询 result db gt query DELETE FROM menu WHERE name new or die db gt error result db gt query DELETE F
  • CodeIgniter:My_Lang 中的 get_instance

    我发现这个有用的国际化代码 http pastebin com SyKmPYTX http pastebin com SyKmPYTX 一切正常 除了我无法在此类中使用 CI 函数 我想从 DB 设置 languages 和 special
  • 映射 mysql 中同一个表的多个值

    您好 我必须使用另一个表中的值 id 获取文本值 表 1 包含值 ID 表 2 包含名称和值 ID 表 1 SEVERITY OCCURENCE DETECTABILITY 2 3 4 表 2 id name value 1 Very Hi
  • 从 Laravel 4 输入生成新数组

    我使用 Input all 从动态生成的表单中获取一些输入 我使用 jQuery 来允许用户添加字段 字段名称为 first names last names 和 emails input 变量现在看起来像这样 array size 4 t
  • SQL不允许表中有重复记录

    如何使其不添加重复项 我想让它通过 ID 之外的所有其他列进行检查 我希望这个无效 ID col1 col2 col3 1 first middle last ID col1 col2 col3 2 first middle last 我希
  • PHP 检查当前日期是在设定日期之前还是之后

    我从数据库中提取一个日期 其格式为 dd mm YYYY 我想做的是检查当前日期 如果当前日期早于数据库中的日期 则需要打印数据库日期 如果是在之后 则需要打印 继续 有人能指出我正确的方向吗 if strtotime database d
  • PHP session_regenerate_id 和黑莓浏览器

    问候 我正在开发一个登录系统 并陷入了黑莓浏览器身份验证的困境 他们似乎对 PHP 的 session regenerate id 有问题 有人可以建议替代方案吗 以下是身份验证和登录脚本 UPDATE看来会话一般都不起作用 拿出 sess
  • PHP 拒绝从 var_dump、print 等输出数据

    我目前正在运行 WAMP 服务器 并且在过去的 30 分钟内一直在尝试弄清楚我的项目如何以及为什么不会输出任何指定的 PHP 数据 起初我以为是因为我有一个 htaccess文件的output buffering被禁用 所以我删除了它 仍然
  • PHP更改小数点分隔符

    在某些情况下 PHP 会在操作后更改小数点分隔符 下面是一个示例 为什么小数点分隔符变成 这是一个多语言网站 在西班牙语版本中 区域设置设置为西班牙语 es ES 小数点分隔符为 这就是为什么正在改变 解决方案是强制 LC NUMERIC

随机推荐

  • MySQL:多行作为逗号分隔的单行

    我有两个表 DISH 和 DISH HAS DISHES Dish 表包含所有菜肴 Dish has dishes 表与 Dish 表具有一对多关系 IE 一个菜可以有多个菜 例如 DISH dish id dish name 1 dish
  • 获取一行sql中具有最大值的列名

    我的数据库中有一个表 其中存储新闻文章的类别 每次用户阅读文章时 都会增加相关列中的值 像这样 现在我想执行一个查询 在其中可以获得每条记录的 4 个最高值的列名 例如 对于用户 9 它将返回 我尝试了很多事情 搜索了很多 但不知道该怎么做
  • 在具有有序因子的 data.frame 上使用 apply 与排名和顺序时出现奇怪的行为

    我发现了一些奇怪的行为apply 假设我有一个任意有序变量矩阵 set seed 4 x lt ordered sample 1 10 size 4 replace T y lt ordered sample 1 10 size 4 rep
  • 类似 Ruby 的问题:让这个函数更短(ActionScript 3)

    我刚刚编写了这段极其冗长的代码 将 2 这样的数字转换为 02 您能否缩短此功能 保持功能 public static function format n int minimumLength int String var retVal St
  • 迭代到大范围时出现 Python 内存错误

    total 0 x 2 32 for i in range x total total i print total 我得到了MemoryError循环到某个范围时2 32 有没有办法在不耗尽内存的情况下进行迭代 This is what h
  • typescript 中 switch 的替代方案

    我正在尝试为我的开关盒寻找任何替代方案 因为它很长 我有嵌套的开关盒 看起来像这样 switch currentTab case pending switch status case approved case denied break c
  • Scrapy 中的嵌套选择器

    我无法按照 Scrapy 文档中的描述让嵌套选择器工作 http doc scrapy org en latest topics selectors html 这是我得到的 sel Selector response level3field
  • 错误:运行 Spring 集成测试时没有 ServletContext 资源的 URL

    我正在为我的 Spring 控制器运行集成测试 测试包括一个配置文件 view configuration xml 具有tilesConfigurer我收到错误的 beanNo URL for ServletContext resource
  • 如何绘制物体的特定或多个轮廓

    我似乎找不到一种方法来绘制多个物体的轮廓 输入图像 Code import cv2 import numpy as np import image img cv2 imread img png 0 Thresh ret thresh cv2
  • 如何在 Google 地图自动完成建议中显示附加信息?

    我正在使用 Google 地方信息自动完成功能按名称选择城市 目前 它在建议下拉列表中仅显示城市名称及其所属国家 地区 我检查并发现 选择城市时填充的 address components 对象具有其他属性 例如州 省和地址的其他部分 因此
  • 使用 jQuery 访问绑定到事件处理程序的函数

    使用 jQuery 您可以将函数绑定到 DOM 对象上触发的事件 使用 bind 或事件处理程序辅助函数之一 jQuery 必须以某种方式在内部存储它 我想知道是否有可能给定一个 DOM 对象 找出哪些事件已绑定到该对象 并访问这些函数等
  • PHPMailer 和函数 escapeshellcmd()

    我使用新版本的 PHPMailer 在服务器上 我收到错误 警告 出于安全原因 escapeshellcmd 已在 public html library email class phpmailer php 第 1442 行被禁用 有没有一
  • 在 CUDA 中对结构数组进行排序

    我有一台配备 NVIDIA GT750M 4Gb 计算能力 3 0 显卡的笔记本电脑 我需要对 CUDA 上的结构数组 大约 3 10 7 元素 进行排序 但我不知道怎么做 因为我在 CUDA 方面没有足够的经验 使用时thrust sor
  • Android SQLite错误代码21

    我的模拟器的日志文件中出现以下错误 我不知道该怎么办 因为谷歌搜索没有发现任何结果 03 12 12 53 28 782 INFO Database 688 sqlite returned error code 21 msg misuse
  • 为什么在 Mac 上输入括号时 Python 的 IDLE 会崩溃?

    好吧 我意识到这可能是一个非常微妙的问题 但它已经困扰我一段时间了 我喜欢 IDLE 的简单脚本界面 但在以下情况下它会不断崩溃 1 我在外部显示器上编码 2 我键入括号按钮 IDLE 永远不会因为任何其他原因而崩溃比这个非常具体的情况 奇
  • 如何访问扩展程序中的书签页面和其他 chrome 网址?

    我正在开发一个扩展 它用一组其他功能替换新的标签页 我在新的 新标签 页面上有一个链接 我已经设置了它的值href归因于chrome bookmarks 但每当我点击它时 我都会在控制台中收到一条错误消息 不允许加载本地资源 我也尝试加载解
  • 为什么 C# -> CIL 每条指令都有标签?

    在编译的 C 程序上使用 ILDASM exe 时 它 显示方法中的每条指令都有一个标签 例如 IL 0001 ldc i4 4 IL 0002 stloc 0 IL 0003 ldc r8 12 34 IL 000c stloc 1 IL
  • IE/Edge 单击 SVG 会导致错误 - TypeError:对象不支持属性或方法“模糊”

    我正在使用角度组件 角度 UI 分页 尽管我不认为这是问题的原因 并且我的模板包含以下内容
  • ASM:输出java字节码和操作码

    我正在尝试编写一个程序 该程序采用 class 文件并收集 class 文件的所有方法以及每个方法的内容 这是我的代码 public class ClassReaderTest1 public static void main String
  • MySQL 代码导致 PHP 脚本在 popen/exec 处崩溃

    我有以下内容PHP 5 6 19上的代码Ubuntu 14 04服务器 这段代码只是连接到一个MySQL 5 6 28数据库 等待一分钟 启动其自身的另一个进程 然后退出 注意 这是完整的脚本 其目的是演示问题 它没有做任何有用的事情 cl