gpt4 book ai didi

php - 如何模拟内置的 php 套接字函数?

转载 作者:行者123 更新时间:2023-12-03 11:56:32 24 4
gpt4 key购买 nike

我正在处理一些从套接字读取的代码,当它获得一定的大输入时出错。在修复它之前,我为此添加了一个单元测试,但由于无法模拟 fread(以及我正在使用的其他 PHP 内置函数,例如 fsockopenfeof 等)。

简单来说,我的问题是此代码因“ fatal error :无法重新声明 fgets() ...”而失败:

function fgets($fp){
return "xxx";
}

我意识到我可以创建一个我的真实代码使用的套接字包装器类,然后我可以为该包装器类创建一个模拟对象。但这就是 The Tail Waging The Dog,我能想到这是一个坏主意的原因,而不仅仅是事情的原则。 (例如,使代码更复杂、更高效、必须重构尚未测试的代码。)

所以,我的问题是如何在单元测试中用我自己的实现替换内置的 fgets() 实现? (或者,如果您想跳出框框思考,问题可以表述为:当 $socket 是调用 fsockopen 的返回值?)


放在一边

按照正确答案的要求安装apd是一项艰巨的工作;它最后一次发布是在 2004 年,不支持开箱即用的 php 5.3。没有适用于它的 Ubuntu 软件包,而且 pecl install apd 也失败了。所以这是安装它的过程(这些是针对 ubuntu 10.04 的)(全部以 root 身份完成):

pecl download apd
tar xzf apd-1.0.1.tgz
cd apd-1.0.1
phpize
./configure
# Do edits (see below)
make install

参见 https://bugs.php.net/bug.php?id=58798对于你需要做的补丁。注意。只有一行你真的需要改变,所以你可以手动完成,如下所示:在文本编辑器中打开 php_apd.c,转到第 967 行,并替换 CG(extended_info) = 1 符合这个:

CG(compiler_options) |= ZEND_COMPILE_EXTENDED_INFO;

最后,您需要添加一个 php.ini 条目来激活它。参见 http://php.net/manual/en/apd.installation.php

最佳答案

如果您无权访问 APD 或 Runkit 但正在使用命名空间,请尝试以下操作:https://stackoverflow.com/a/5337635/664108 (链接中的答案指的是 time() 但没有区别)

关于php - 如何模拟内置的 php 套接字函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11280506/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com