包含 php 标签的文章

在 Mac OS X 10.11 (EL Capitan) 上手动编译 php 并且使用系统自带的 openssl dylib

TEST

PHP 加载 php_curl.dll 时启动出现 PHP Warning: PHP Startup: in Unknown on line 0 错误的解决办法

最近升级了一下开发环境的 PHP 版本,结果启动后一直找不到 curl 相关函数,查看日志,发现 Apache 启动时出现 PHP Warning:  PHP Startup:  in Unknown on line 0 的错误,逐个排查后,发现取消 php_curl.dll 的加载就没有这个错误了。搜索各种查,都说要把几个 dll 文件复制到 Windows 或者 Apache 的目录里,但在我这都不管用,最后发现唯有一个 libssh2.dll 文件复制到 Apache 的 bin 目录才管用。

但是现在可以不用复制文件,就可以解决的办法(洁癖。。),在 Apache 的配置文件中,加入以下配置,即可:

LoadFile "C:/php/libssh2.dll"

里面文件的路径就是你 php 目录下 libssh2.dll 文件路径,根据自己情况修改,然后重启即可。还有一些人的原因是找不到 libeay32.dll 和 ssleay32.dll 这两个文件,解决的办法大致相同。

另外一种办法是把你的 php 目录路径加入到环境变量 Path 中去,记住是系统环境变量,而不是用户环境变量,我的情况是在用户环境变量下,libeay32.dll 和 ssleay32.dll 可以找到但却找不到 libssh2.dll,只有放到系统环境变量下才没有问题。

所以原因大概是 PHP 与 Apache 工作时,无法正确找到动态库文件。原因可能有多种,比如系统参数环境变量、系统文件版本、或者某些重要的设置之类的有不同,比如我家里的电脑上就没这个问题,所以这里的答案仅供参考,也许原因正好相同那就解决了。

真的需要对 php 的 CURL 进行封装吗?

等我来写

PHP 第三方序列化扩展 igbinary

igbinary 是一个 php 的第三方扩展,相对于 php 自带的 serialize,igbinary 具有性能高,节省空间的特点,在某些高要求的场景中使用它是个不错的方案。

igbinary 使用一些对应标记和信息分隔变量中数组的键名和值等其它内容,并且依赖这些标记信息进行反序列化。
如数组

array(true, null, 'foo'=>'bar', 'text', 123)

序列化后大概是这种形式
[STX][DC4][ACK][ENQ][ACK][SOH][DC1][EXT]foo[DC1][EXT]bar[ACK][STX][DC1][EOT]text[ACK][EXT][ACK]{
黑色标记的内容,如 [STX] 代表一个位标记(1个字节),这里只是形式表现,并不代表标记就是这样。

阅读全部内容 >>

关于 PHP 中的 isset 和 array_key_exists 的问题

一直以来我都在想既然有 isset 用来判断数组中的指定的键是否存在,为什么还要有 array_key_exists 的存在,因为 isset 不仅更方便而且性能更好,直到今天在程序出现一个诡异的问题,最后查出无论如何 isset 都判断不出一个明显已经存在于数组中的键的问题时才仔细看了一下文档。

原来 isset 对于数组中指定的索引有值的情况下,如果值是 NULL 那么也会返回 FALSE(官方文档),而不是仅仅判断是否有没有这个键,所以理论上来说 isset 仅仅是用来判断键存在且有值(一般情况下 NULL 都代表什么都没有),那么 isset 在很严格的情况下跟 empty 就十分类似而变的不可靠了。

<?php
$arr = array('a'=>'Hello World', 'b'=>null, 'c'=>0);
isset($arr['a']); //TRUE

isset($arr['b']); //FALSE
!empty($arr['b']); //FALSE
array_key_exists('b', $arr); //TRUE

isset($arr['c']); //TRUE
!empty($arr['c']); //FALSE
array_key_exists('c', $arr); //TRUE

所以如果你需要判断指定的键名是否存在于某个数组中,而不管它的值是什么(哪怕是NULL),那么就需使用 array_key_exists,其它多数情况下还是推荐 isset,毕竟性能会更好。