分类 PHP 下的文章

Linux下手工编译libiconv库的小问题

我的电脑是Ubuntu 14.04 LTS, 自己手工编译php5.6, 打开ZEND_EXTRA_LIBS='-liconv'时, 发现没有安装libiconv, 也就是编码转换的库, 所以百度该库的安装方法, 如下:

  1. 下载:# wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
  2. 解压:
    $ tar -zxvf libiconv-1.14.tar.gz
    $ cd libiconv-1.14.1
  3. 安装:
    $ ./configure --prefix=/usr/local
    $ make
    # make install

不过我make的时候出现了一个问题:

n file included from progname.c:26:0:
./stdio.h:1010:1: error: ‘gets’ undeclared here (not in a function)
_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
^
make[2]: *** [progname.o] Error 1
make[2]: Leaving directory `/home/freeman/Downloads/libiconv-1.14_2/srclib'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/home/freeman/Downloads/libiconv-1.14_2/srclib'
make: *** [all] Error 2

原因未明, 应该是软件的bug吧, 后来百度找到了解决方法, 整理如下~

    1. 切换到srclib目录下:
      $ cd srclib
    2. 修改stdio.in.h文件:
      $ gedit stdio.in.h
    3. 定位到
      _GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");

      这一行, 改成:
      #if defined(__GLIBC__) && !defined(__UCLIBC__) && !__GLIBC_PREREQ(2, 16)
       _GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
      #endif

      注意粘贴完下面有两行#endif, 别少复制了一行#endif, 改完是这个样子滴~别忘了保存~
#if defined(__GLIBC__) && !defined(__UCLIBC__) && !__GLIBC_PREREQ(2, 16)
 _GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
#endif
#endif

保存, make就可以了, make install完别忘了

# ldconfig

记下来, 下次就不会忘记了~~

PHP递归和循环的速度测试

写了一个可以对$_GET, $_POST等输入进行过滤的函数,递归实现如下:

function array_map_recursive($filters, $data)
{
	$result = [];
	foreach ($filters as $filter)
	{
		foreach ($data as $key => $value)
		{
			$result[$key] = is_array($value) ? array_map_recursive($filters, $value) : call_user_func($filter, $value);
		}
	}
	return $result;
}

后来想想,以前看书的时候经常说递归函数会浪费堆栈空间,甚至会导致堆栈溢出,于是重新用循环实现了这个个函数:

function array_map_all($filters, $data)
{
	foreach ($filters as $filter)
	{
		$stack = [];
		$stack[] = &$data;
		while ( ! empty($stack))
		{
			$node = &$stack[count($stack) - 1];

			array_pop($stack);

			if ( ! is_array($node))
			{
				$node = call_user_func($filter, $node);
			}
			else
			{
				foreach ($node as $key => $value)
				{
					if ( ! empty($value))
					{
						$stack[] = &$node[$key];
					}
				}
			}
		}
	}
	return $data;
}

写完哇擦~~多了这么多行~~还是递归简洁明了:)

速度如何呢?写个代码测试一下!

$filters = ['trim', 'htmlspecialchars'];
$data = [
	' 5 &',
	[' 3 ', ' 7 '],
	[' 2 ', ' 4 '],
	' 15 ',
	' 4 ',
	['12 ', '  ', ' 3 ', ' 4'],
];

$begin = microtime(true);
for ($i = 0; $i < 10000; $i++)
{
	array_map_recursive($filters, $data);
}
$t1 = microtime(true) - $begin;
echo '递归用时: '.sprintf('%.4f', $t1)."\n";

$begin = microtime(true);
for ($i = 0; $i < 10000; $i++)
{
	array_map_all($filters, $data);
}
$t2 = microtime(true) - $begin;
echo '循环用时: '.sprintf('%.4f', $t2)."\n";

运行结果:

递归用时: 0.4985
循环用时: 0.5489

换个复杂的七维数组,如下:

$data = [
	' 5 &',
	[' 3 ', ' 7 ', [' 55 ', ['    565 ', [' 5445 ', ['da ', [', d '], '3']], 'd d']]],
	[' 2 ', ' 4 '],
	' 15 ',
	' 4 ',
	['12 ', '  ', ' 3 ', ' 4'],
];

运行结果:

递归用时: 5.7484
循环用时: 0.9799

嘿嘿~结果不用我说了吧!还是循环好一些,不过实际应用中,是感觉不到太大差别的,毕竟是10000次循环呐!更何况是一个七维数组呢~

解决phpMyAdmin点击"结构"列页面失去响应的问题

我的环境:

phpMyAdmin版本:4.0.4.1, PHP5.6.11

第一步 关闭自动更新

打开./libraries目录下的vendor_config.php,将VERSION_CHECK_DEFAULT的值设置为FALSE, 意思是关闭自动更新。原因是官方无法访问。
define('VERSION_CHECK_DEFAULT', FALSE);

第二步 修正时间问题

打开./libraries目录下的Util.class.php,查找,
return strftime($date, $timestamp);
替换成下面的代码:
if (extension_loaded('gettext'))
{
    return strftime($date, $timestamp);
}
如果你在中国,使用北京时间,可以替换成下面的代码:
if (extension_loaded('gettext'))
{
    date_default_timezone_set('UTC');
    return gmdate('Y-m-d H:i:s', $timestamp + 28800);
}
至此,再刷新一下页面,点击“结构”等页面,页面的响应速度是不是大大提升了呢?嘿嘿,我的已经解决了,妈妈再也不用担心我又卡在“结构”页面啦!哈哈!最后感谢这篇文章指点迷津哦: http://www.fenanr.com/diy/112032.html