小编Mik*_*e B的帖子

诊断内存泄漏 - 允许#bytes的内存大小耗尽

我遇到了可怕的错误消息,可能通过艰苦的努力,PHP内存不足:

在第123行的file.php中,####字节的允许内存大小耗尽(尝试分配####字节)

增加限制

如果您知道自己在做什么并希望增加限制,请参阅memory_limit:

ini_set('memory_limit', '16M');
ini_set('memory_limit', -1); // no limit
Run Code Online (Sandbox Code Playgroud)

谨防!你可能只是解决症状而不是问题!

诊断泄漏:

错误消息指向一条带有循环的行,我认为该循环正在泄漏或不必要地累积内存.我memory_get_usage()在每次迭代结束时打印语句,可以看到数字慢慢增长,直到达到极限:

foreach ($users as $user) {
    $task = new Task;
    $task->run($user);
    unset($task); // Free the variable in an attempt to recover memory
    print memory_get_usage(true); // increases over time
}
Run Code Online (Sandbox Code Playgroud)

对于这个问题的目的,让我们假设最坏的面条代码可以想象在全球范围内的某处藏匿在$userTask.

什么工具,PHP技巧或调试巫毒可以帮助我找到并解决问题?

php memory-leaks

94
推荐指数
7
解决办法
9万
查看次数

PHP CodeSniffer有用吗?一般的代码标准执行?

我正在考虑在我们的持续集成服务器上设置PHP CodeSniffer,以提高代码库的质量.在阅读文档后,我对标准化和执行我们的编码标准的想法感到非常兴奋.但是,我想知道我们产品的实际改进.我很清楚,嗅探器只检测违反规定的编码标准,但干净,一致的代码库提供了哪些类型的好处?使用100k +代码行重构项目以符合PEAR标准是否值得额外工作?

对于那些不熟悉PHP CodeSniffer或一般代码嗅觉的人,这里有一个示例输出:

文件:/path/to/code/myfile.php发现
5错误(S)影响2行(S)
-
2 | 错误| 缺少文件doc评论
20 | 错误| PHP关键字必须小写; 预期"假"但发现"假"
47 | 错误| 线没有正确缩进; 预计4个空格,但发现1
51 | 错误| 缺少功能doc评论
88 | 错误| 线没有正确缩进; 预计9个车位,但发现6个

严格地说,用户/客户不会注意到被重构为符合标准的产品有任何差异,但我想知道是否还有其他隐藏的好处

现在我们的代码绝不是草率的,我们试图遵循我们自己的个人标准,这些标准在很大程度上源自Pear的编码标准,但训练有素的眼睛可以发现差异.

所以我的问题是它们能提高产品质量的程度.它带来了什么样的潜在好处?

我是否只是因为我希望将我们的产品更接近一套标准而产生强迫症?它值得吗?如果是这样,您使用了什么样的策略来实现代码嗅探器并纠正检测到的后续违规?

php codesniffer

54
推荐指数
4
解决办法
4万
查看次数

如何在没有内存错误的情况下使用var_dump + output buffering?

我在一个应用程序中使用调试辅助工具,该应用程序使用var_dump()输出缓冲来捕获变量并显示它们.但是,我遇到了大型对象的问题,最终在缓冲区中占用了太多内存.

function getFormattedOutput(mixed $var) {
  if (isTooLarge($var)) { 
    return 'Too large! Abort!'; // What a solution *might* look like
  }

  ob_start();
  var_dump($var); // Fatal error:  Allowed memory size of 536870912 bytes exhausted
  $data = ob_get_clean();

  // Return the nicely-formated data to use later
  return $data
}
Run Code Online (Sandbox Code Playgroud)

有没有办法阻止这种情况?或者解决方法是检测它是否要为特定变量输出大量信息?我真的没有控制哪些变量传递给这个函数.它可以是任何类型.

php memory

39
推荐指数
5
解决办法
4904
查看次数

SAML和PHP入门

我正在开始为项目添加SAML SSO支持,我正在寻找专门针对PHP的有用资源.我理解了基本的概念,并且已经开始探索任何可以提供帮助但却空洞的库.我发现的唯一的东西是simpleSAMLphp,它似乎是一个完整的堆栈.

有关将SAML集成到现有项目的任何提示吗?Zend-Framework相关建议的奖励积分!

php saml single-sign-on

27
推荐指数
3
解决办法
3万
查看次数

PHP文件上传,文件在move_uploaded_files之前从/ tmp消失

我有一个非常基本的上传脚本,可能直接从php.net/move_upload_files功能页面解除.

move_uploaded_file()失败,因为它无法在tmp文件夹中找到tmp文件.但是我知道它被放在那里,但move_upload_file()在我的脚本中处理它之前就被删除了.我知道它被放在那里,因为当一个大文件被发布到服务器时我可以在那里看到一个文件.

$_FILES包含我刚刚上传的文件的正确详细信息.

有没有人知道为什么临时文件在我有机会处理之前从/ tmp中删除了?

这是我正在使用的基本代码.

if(move_uploaded_file($_FILES['userfile']['tmp_name'], $upload_file))
{
    $result['error'] = 'false';
    $result['file_loc'] = $upload_file;
}
else
{
    $result['error'] = 'true';
}
Run Code Online (Sandbox Code Playgroud)

输出print_r($_FILES)看起来像

[userfile] => Array
(
    [name] => switchsolo.png
    [type] => image/png
    [tmp_name] => /tmp/phpIyKRl5
    [error] => 0
    [size] => 6690
)
Run Code Online (Sandbox Code Playgroud)

但/ tmp/phpIyKRl5根本就不存在.

php upload file-upload file

15
推荐指数
3
解决办法
3万
查看次数

格式化MySQL查询的结果,就好像它是从控制台运行一样

我正在编写一个快速而脏的报告脚本,用于查询报告并通过电子邮件发送结果.使用MySQL控制台时,结果位于格式良好的表中:

mysql> select * from users;
+-----------+------------+-------+
| firstname | city       | zip   |
+-----------+------------+-------+
| Maria     | Holland    | 12345 |
| Rene      | Doylestown | 65432 |
| Helen     | Conway     | 98745 |
+-----------+------------+-------+
3 rows in set (0.01 sec)
Run Code Online (Sandbox Code Playgroud)

使用PHP获取结果时,是否有一种简单的方法来复制此格式?显然,我可以通过编写自己的报告格式化程序来实现这一目标,但我希望能有一些更优雅的东西.

php mysql formatting zend-framework

12
推荐指数
2
解决办法
3440
查看次数

生产分析代码

我正在考虑实现在生产服务器上配置代码并想要一些最佳实践建议的想法.显然,这是一个坏主意,配置文件,因为增加的开销的所有请求,所以我一直在寻找到一些技术,会随机调用每个请求的探查.每10,000个请求中有1个配置文件.

我知道有一种方法可以实现与Facebook的这样一个任务XHProf的探查,但使用的XDebug希望的是类似的解决方案.

所以我的问题是(假设xdebug是分析器):

  1. 这种功能是否可取?我想从生产环境中获取一些真实世界的数据,但是如果它意味着由于开销而破坏用户体验.
  2. 在生产中安装xdebug是否以任何方式打开服务器攻击者/开发者(假设调试器未启用)?这种类型的设置是否有锅炉板配置?
  3. 触发分析器获得适当样本量的最佳方法是什么?

对此事的任何其他见解将非常感激.

php profiling xdebug xhprof

11
推荐指数
1
解决办法
4072
查看次数

使用默认属性创建模拟对象

我需要使用默认的属性集创建一个模拟对象,以便在实例化时可以在代码库中使用elseware.

$mock = $this->getMock('MyClass', array(), array(), 'MyClass_Mock');
$mock->prop = 'foobar';

$myclassMock = new get_class($mock);
var_dump($myclassMock->prop); // NULL
// How can I make this dump 'foobar' ?
Run Code Online (Sandbox Code Playgroud)

我正在测试确定,定位和实例化这些类的框架的一部分,因此注入模拟对象会破坏测试的目的.

我不需要模拟任何方法..只需动态创建一个模拟类,如下所示:

class MyClass_Mock extends MyClass {
  public $prop = 'foobar';
}
Run Code Online (Sandbox Code Playgroud)

编辑:简化示例

php phpunit

11
推荐指数
1
解决办法
9847
查看次数

mb_str_replace()...很慢.任何替代品?

我想确保我正在运行的一些字符串替换是多字节安全的.我在网络周围发现了一些mb_str_replace函数,但它们很慢.通过它可能会通过500-900字节后,我说的话增加了20%.

有什么建议?我正在考虑使用preg_replace,因为它是本机的并且已经编译,所以它可能更快.任何想法将不胜感激.

php multibyte

8
推荐指数
1
解决办法
3万
查看次数

在PHP中是否有"双"类型

如果没有,那么如何声明一个双重类型的数字?

function testFloat(float $f)
{
    return $f;
}

echo testFloat(1.2);
Run Code Online (Sandbox Code Playgroud)

可捕获的致命错误:传递给testFloat()的参数1必须是float的实例,double给出

php

7
推荐指数
2
解决办法
1万
查看次数