风火家人开发记要

技术总结精华贴

Category: 服务器

PHP, 原创, 服务器, ,

ceontos安装php7.2 提示cURL version 7.10.5 or later is required to compile php with cURL support

centos 安装 php7.2及以上版本的时候还是有几点需要注意的。 不要使用 php.net Download 提供的下载地址,而是使用 git上的下载地址,原因php.net下的里面存在一些bug,一些文件不全,导致无法安装mysqlnd扩展等。类似这种错误: ext/curl/multi.c:501: undefined reference to curl_pushheader_bynum 先安装一些依赖包 sudo yum install -y libxml2-devel sudo yum -y install libcurl-devel sudo yum install openssl openssl-devel sudo yum install bzip2 bzip2-devel sudo yum install freetype-devel sudo yum install libxslt-devel 在运行 ./configure –with-pdo-mysql=mysqlnd –with-mysqli=mysqlnd –enable-fpm –with-curl –with-fd –enable-mbstring 如果 centos7 php7动态编译出现mysqlnd: configure: error: Cannot find OpenSSL’s <evp.h> 错误,显然已经安装了openssl, openssl-devel,为什么还是提示这个错误,搜索了一下evp.h,这个文件也存在。GOOGLE 了一下,在stackoverflow,找到了答案,原来是 phpize 生成的configure脚本有问题。 解决方法: export PHP_OPENSSL_DIR=yes ./configure -with-openssl-dir=/usr/include/openssl –with-pdo-mysql=mysqlnd –with-mysqli=mysqlnd –enable-fpm –with-curl –with-fd –enable-mbstring 以上参数可根据实际情况先不带,后面需要在增加相关扩展。 Ubuntu先编译提示 evp.h的请参考 解决Ubuntu下php 7.0.6 生成 openssl.so报错,configure: error: Cannot find OpenSSLs evp.h。   (656)

查看全文
原创, 服务器

算法之 分治法/递归排序/归并排序 代码PHP版

先定义递归/分治/归并函数 function merge_sort($data = array(), $start = 0, $length = 0) { if($length – $start > 1) { $middle = floor(($start + $length) / 2); $data = merge_sort($data, $start, $middle); $data = merge_sort($data, $middle, $length); $data = merge($data, $start, $middle, $length); } return $data; } function merge($data = array(), $start=0, $middle=0, $length=0) { $left = $middle – $start; $right = $length – $middle; $array_left = array(); $array_right = array(); for($i = 0; $i < $left; $i++) { $array_left[$i] = $data[$start + $i]; } for($j = 0; $j < $right; $j++) { $array_right[$j] = $data[$middle + $j]; } $m = $n = 0; for($k = $start; $k < $length; $k++) { if( ! empty($array_left[$m]) && ! empty($array_right[$n])) { if($array_left[$m] <= $array_right[$n]) { $data[$k] = $array_left[$m]; $m++; } else { $data[$k] = $array_right[$n]; $n++; } } elseif ( ! empty($array_left[$m])) { $data[$k] = $array_left[$m]; $m++; } else { $data[$k] = $array_right[$n]; $n++; } } return $data; } 调用方法 $result = merge_sort($data, 0, count($data)) 返回一个升序的数组 时间复杂度 Θ(n lgn) 难点: 感觉到处是难点  虽然自己成功调试出正确结果,但总是感觉不能全部理解。 (366)

查看全文
原创, 服务器,

PHP json_decode 返回 NULL 终极解决方案

最近做抓取网页json结果 json_decode 的时候 总是返回 null, 网上 给出几种解决方法 解决方法一: 出现这个问题是因为在 json 字符串中反斜杠被转义,只需要用 htmlspecialchars_decode() 函数处理一下 $content 即可: $content = htmlspecialchars_decode($content); 此时再使用 json_decode() 函数解析,就没有问题了. 另外一种 解决方法二: 在保存 json 数据时使用 urlencode() 函数: $content = urlencode(json_encode($content)); 解析时使用 urldecode() 函数: $content = urldecode($content); 即可避免反斜杠转义造成的无法解析。 但是以上2种并没有解决 返回NULL的问题,于是又看了另外一个解决方案 确保原字符串是UTF-8编码的 使用函数 mb_detect_encoding()检测 如果不是 采用 iconv(‘gbk’,’utf-8′, $result_string),用iconv函数改变的编码格式 不巧的是 我的字符串是 UTF-8的 再次查找 json_decode要求的字符串比较严格: (1)使用UTF-8编码 (2)不能在最后元素有逗号 (3)不能使用单引号 (4)不能有\r,\t,如果有请替换 以上竟然也不能解决, 于是 使用二进制 将字符串转化成二进制,和正常的比较,发现开头多了 111011111011101110111111 而这个东西竟然是 文件的BOM格式 使用下面的格式去除BOM头 $charset[1] = substr($result, 0, 1); $charset[2] = substr($result, 1, 1); $charset[3] = substr($result, 2, 1); if(ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191){ $result = substr($result, 3); } 或者 $result = json_decode(trim($result,chr(239).chr(187).chr(191)),true); 至此 问题解决 (444)

查看全文