Hi,
I encountered a problem with a memory leak using Microsoft Windows Server 2008 R2, IIS/FastCGI, sqlsrv 2.0.182 and php 5.2.17 (php_sqlsrv_52_ts_vc6.dll) / php 5.3.8 (php_sqlsrv_53_nts_vc9.dll).
Please have a look at the test script appended and the results it produces. Freeing the statement or closing and reopening the connection did not make a difference in my tests.
Running the same script with mysqli does not show the effect of constantly increasing memory usage.
Any help would be appreciated.
Best regards
Lars Teuber
<?php
$db_conn = get_db_conn_sqlsrv();
#$db_conn = get_db_conn_mysqli();
$query = "SELECT 1 AS dummy"; // FROM DUAL
$seconds = 10; //60 * 60;
echo '<br>php version: [' . phpversion() . ']';
echo '<br>sapi name: [' . php_sapi_name() . ']';
echo '<br>runtime: [' . $seconds . 's]';
echo '<br>memory_get_usage start: [' . memory_get_usage() . ']';
echo '<br>memory usage by tasklist start: [' . memory_get_usage_by_tasklist() . ']';
$start_time = time();
while (time() - $start_time < $seconds) {
db_query_sqlsrv($db_conn, $query);
#db_query_mysqli($db_conn, $query);
}
echo '<br>memory_get_usage end: [' . memory_get_usage() . ']';
echo '<br>memory_get_peak_usage: [' . memory_get_peak_usage() . ']';
echo '<br>memory_get_peak_usage real: [' . memory_get_peak_usage(true) . ']';
echo '<br>memory usage by tasklist end: [' . memory_get_usage_by_tasklist() . ']';
function db_query_sqlsrv($conn, $query)
{
$res = sqlsrv_query($conn, $query);
if (!$res) {
throw new Exception('query failed');
}
#sqlsrv_free_stmt($res);
#sqlsrv_close($conn);
}
function db_query_mysqli($conn, $query)
{
$query_id = mysqli_query($conn, $query);
if (!$query_id) {
throw new Exception('Invalid SQL: ' . $query);
}
}
function get_db_conn_sqlsrv()
{
$host = "xxx,1234";
$conn_info = array(
'Database' => 'db_name',
'MultipleActiveResultSets' => true,
'CharacterSet' => 'UTF-8',
'UID' => 'uid',
'PWD' => 'pwd'
);
sqlsrv_configure('WarningsReturnAsErrors', 0);
$conn = sqlsrv_connect($host, $conn_info);
if (!$conn) {
throw new Exception('no link');
}
return $conn;
}
function get_db_conn_mysqli()
{
$host = 'xxx';
$user = 'user';
$pass = 'pwd';
$port = '1234';
$database = 'db';
$link_id = mysqli_connect($host, $user, $pass, '', $port);
if (!$link_id) {
throw new Exception('no connection');
}
if (!mysqli_select_db($link_id, $database)) {
throw new Exception('cannot use database');
}
return $link_id;
}
// = "working set memory" in taskmgr (windows server 2008r2)
function memory_get_usage_by_tasklist()
{
if (!is_windows()) {
return 'n/a';
}
$output = array();
exec('tasklist ', $output);
foreach ($output as $value) {
$ex = explode(" ", $value);
$count_ex = count($ex);
if (preg_match('/ ' . getmypid() . ' Services/', $value)) {
$memory_size = $ex[$count_ex - 2] . ' Kb';
return $memory_size;
}
}
}
function is_windows()
{
return (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN');
}
?>
-->
sqlsrv
------
php version: [5.2.17]
sapi name: [cgi-fcgi]
runtime: [60s]
memory_get_usage start: [94384]
memory usage by tasklist start: [16.028 Kb]
memory_get_usage end: [93072]
memory_get_peak_usage: [125696]
memory_get_peak_usage real: [262144]
memory usage by tasklist end: [29.392 Kb]
php version: [5.2.17]
sapi name: [cgi-fcgi]
runtime: [3600s]
memory_get_usage start: [91384]
memory usage by tasklist start: [14.768 Kb]
memory_get_usage end: [89904]
memory_get_peak_usage: [123424]
memory_get_peak_usage real: [262144]
memory usage by tasklist end: [262.692 Kb]
php version: [5.3.8]
sapi name: [cgi-fcgi]
runtime: [3600s]
memory_get_usage start: [326688]
memory usage by tasklist start: [14.760 Kb]
memory_get_usage end: [325128]
memory_get_peak_usage: [359304]
memory_get_peak_usage real: [524288]
memory usage by tasklist end: [618.376 Kb]
I encountered a problem with a memory leak using Microsoft Windows Server 2008 R2, IIS/FastCGI, sqlsrv 2.0.182 and php 5.2.17 (php_sqlsrv_52_ts_vc6.dll) / php 5.3.8 (php_sqlsrv_53_nts_vc9.dll).
Please have a look at the test script appended and the results it produces. Freeing the statement or closing and reopening the connection did not make a difference in my tests.
Running the same script with mysqli does not show the effect of constantly increasing memory usage.
Any help would be appreciated.
Best regards
Lars Teuber
<?php
$db_conn = get_db_conn_sqlsrv();
#$db_conn = get_db_conn_mysqli();
$query = "SELECT 1 AS dummy"; // FROM DUAL
$seconds = 10; //60 * 60;
echo '<br>php version: [' . phpversion() . ']';
echo '<br>sapi name: [' . php_sapi_name() . ']';
echo '<br>runtime: [' . $seconds . 's]';
echo '<br>memory_get_usage start: [' . memory_get_usage() . ']';
echo '<br>memory usage by tasklist start: [' . memory_get_usage_by_tasklist() . ']';
$start_time = time();
while (time() - $start_time < $seconds) {
db_query_sqlsrv($db_conn, $query);
#db_query_mysqli($db_conn, $query);
}
echo '<br>memory_get_usage end: [' . memory_get_usage() . ']';
echo '<br>memory_get_peak_usage: [' . memory_get_peak_usage() . ']';
echo '<br>memory_get_peak_usage real: [' . memory_get_peak_usage(true) . ']';
echo '<br>memory usage by tasklist end: [' . memory_get_usage_by_tasklist() . ']';
function db_query_sqlsrv($conn, $query)
{
$res = sqlsrv_query($conn, $query);
if (!$res) {
throw new Exception('query failed');
}
#sqlsrv_free_stmt($res);
#sqlsrv_close($conn);
}
function db_query_mysqli($conn, $query)
{
$query_id = mysqli_query($conn, $query);
if (!$query_id) {
throw new Exception('Invalid SQL: ' . $query);
}
}
function get_db_conn_sqlsrv()
{
$host = "xxx,1234";
$conn_info = array(
'Database' => 'db_name',
'MultipleActiveResultSets' => true,
'CharacterSet' => 'UTF-8',
'UID' => 'uid',
'PWD' => 'pwd'
);
sqlsrv_configure('WarningsReturnAsErrors', 0);
$conn = sqlsrv_connect($host, $conn_info);
if (!$conn) {
throw new Exception('no link');
}
return $conn;
}
function get_db_conn_mysqli()
{
$host = 'xxx';
$user = 'user';
$pass = 'pwd';
$port = '1234';
$database = 'db';
$link_id = mysqli_connect($host, $user, $pass, '', $port);
if (!$link_id) {
throw new Exception('no connection');
}
if (!mysqli_select_db($link_id, $database)) {
throw new Exception('cannot use database');
}
return $link_id;
}
// = "working set memory" in taskmgr (windows server 2008r2)
function memory_get_usage_by_tasklist()
{
if (!is_windows()) {
return 'n/a';
}
$output = array();
exec('tasklist ', $output);
foreach ($output as $value) {
$ex = explode(" ", $value);
$count_ex = count($ex);
if (preg_match('/ ' . getmypid() . ' Services/', $value)) {
$memory_size = $ex[$count_ex - 2] . ' Kb';
return $memory_size;
}
}
}
function is_windows()
{
return (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN');
}
?>
-->
sqlsrv
------
php version: [5.2.17]
sapi name: [cgi-fcgi]
runtime: [60s]
memory_get_usage start: [94384]
memory usage by tasklist start: [16.028 Kb]
memory_get_usage end: [93072]
memory_get_peak_usage: [125696]
memory_get_peak_usage real: [262144]
memory usage by tasklist end: [29.392 Kb]
php version: [5.2.17]
sapi name: [cgi-fcgi]
runtime: [3600s]
memory_get_usage start: [91384]
memory usage by tasklist start: [14.768 Kb]
memory_get_usage end: [89904]
memory_get_peak_usage: [123424]
memory_get_peak_usage real: [262144]
memory usage by tasklist end: [262.692 Kb]
php version: [5.3.8]
sapi name: [cgi-fcgi]
runtime: [3600s]
memory_get_usage start: [326688]
memory usage by tasklist start: [14.760 Kb]
memory_get_usage end: [325128]
memory_get_peak_usage: [359304]
memory_get_peak_usage real: [524288]
memory usage by tasklist end: [618.376 Kb]