28
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

闇PHPAdvent Calendar 2015

Day 8

意図的にメモリリークを起こすためのPHP組み込み関数

Last updated at Posted at 2015-12-07

小ネタですが、カレンダーの穴埋めということで。

あまり知られていませんが、PHPには次のような組み込み関数が用意されています。

leak

(PHP >= 5.0.0 ?)

void leak( [int $num_bytes = 3] )

$num_bytesのメモリ確保を行う(勝手には解放されないのでメモリリークになる)

leak_variable

(PHP >= 5.4.0)

void leak_variable(mixed $variable [, bool $leak_data = false] )

$variableの参照カウントを増やす(勝手には減らないのでメモリリークになる)

といっても、この関数は大半の人の手元では動かないと思います。これはPHPを--enable-debugつきでビルドしたときだけ有効になります。

$ php -v
PHP 5.6.15 (cli) (built: Dec  8 2015 08:29:42) (DEBUG)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
    with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
    with Xdebug v2.3.3, Copyright (c) 2002-2015, by Derick Rethans
$ php -r 'leak();'
[Tue Dec  8 08:44:41 2015]  Script:  '-'
/var/tmp/php-build/source/5.6.15-debug/Zend/zend_builtin_functions.c(1443) :  Freeing 0x10319E0A8 (3 bytes), script=-
=== Total 1 memory leaks detected ===
$

このように、leak関数を呼び出すと--enable-debugで有効になるメモリリーク検出機構が働いて、どんなメモリリークが起きたか教えてくれるというわけです。

この関数はメモリマネージャの改造をしたりするときに便利らしいです(moriyoshiさん談)。

28
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
26

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?