gabrielelana/violent-death

生成段错误的本地扩展

0.2.0 2014-05-21 21:54 UTC

This package is auto-updated.

Last update: 2024-09-08 07:23:59 UTC


README

你如何知道你的代码是容错的?你如何验证它不会以一种可怕且无法恢复的方式在发生坏事时崩溃?此包将帮助您模拟您的代码在其生命周期中可能面临的最致命事件。

场景

你想测试你代码的容错性。你想要确保你的代码总是以一致的状态离开这个世界。问题是你在PHP内部可以创建的失败类型有

  • 软性:它们或多或少由PHP解释器管理
  • 可预测的:它们是由你以同步方式创建的,在现实生活中,当你不期望时会发生真实的事情,但你不能模拟当你正在执行查询或向远程服务器发出请求时的失败

如果你在问自己如何管理这种类型的失败,那么graceful-death 就是你的答案

用法

<?php

require __DIR__ . "/../vendor/autoload.php";

// The output will be something like:
//
// What is this? Should I drink it?
// There, I drank it, I will die eventually...
// Still there :-)
// Still there :-)
// …
// Still there :-)
// [1]    26584 segmentation fault (core dumped)  php examples/drink_poison.php

echo "What is this? Should I drink it?\n";
drink_poison($msToTakeEffect=500, $msToAgonizeAtMost=1000);
// Here we have created a background thread that will wait
// at least for 500ms and at most 1500ms before to cause
// an horrible death with a segmentation fault

echo "There, I drank it, I will die eventually...\n";
while(true) {
    echo "Still there :-)\n";
    usleep(50000);
}

它是如何工作的?

为了创建段错误,我们依赖于一个C扩展。为了最终在代码执行其他操作时创建段错误,我们创建一个后台线程,该线程将等待一段时间,然后引发段错误。

注意事项

你需要能够编译PHP扩展,并且需要安装pthread库。段错误在所有平台上不保证(即对于C编译器、操作系统内核和CPU架构的每个组合),因此它可能不起作用。据我所知,段错误的概念不是ANSI C标准的一部分,因此没有创建真正的段错误的标准方法。

概述

drink_poison($msToTakeEffect, $msToAgonizeAtMost, $probabilityToDie)

它将在至少 $msToTakeEffect 毫秒后,最多在 $msToTakeEffect + $msToAgonizeAtMost 毫秒后引发段错误。这将在后台线程中异步发生,因此在此调用之后,代码可以继续其正常流程

  • int $msToTakeEffect:在毒药起效前等待的毫秒数
  • int $msToAgonizeAtMost:在毒药结束你的代码前最多等待的毫秒数。默认 0
  • int $probabilityToDie:死亡的概率百分比。介于 1100 之间的整数。默认 100

play_russian_roulette($probabilityToDie)

它可能会创建段错误。概率百分比可以作为参数传递

  • int $probabilityToDie:死亡的概率百分比。介于 1100 之间的整数。默认 16

在Blast扩展中: die_violently_after($msToWait)

在Blast扩展中: die_violently($msToWait)

安装

您可以通过composer舒适地安装此包

$ composer require "gabrielelana/violent-death"

但在您需要之前,您需要安装 blast 本地扩展

安装本地扩展

为了确保造成尽可能多的破坏,我们需要人类已知的最具破坏力和最可靠的自我毁灭武器:C语言

$ phphize
$ ./configure --with-pthread
$ make
$ sudo make install

希望现在扩展已经编译并安装。现在你需要将 extension=blast.so 添加到你的 php.ini 文件中。运行以下命令,如果你看到绿色条,那么你可以继续了

$ composer install
$ vendor/bin/phpunit

自我推广

如果你喜欢这个项目,那么请考虑以下