PHP基础踩坑
- in_array 踩坑
如果写法 in_array('*',$arr); 这种写法是错误的, 如果 $arr=[0]; 该判断就为true了
正确写法 !empty(array_instract(["*"],$arr)); 通过判断交集是否为空来判断更准确, 避免数组中包含 0 时导致字符串in_array都为true的情况 如果写法 in_array('*',$arr); 这种写法是错误的, 如果 $arr=[0]; 该判断就为true了
正确写法 !empty(array_instract(["*"],$arr)); 通过判断交集是否为空来判断更准确, 避免数组中包含 0 时导致字符串in_array都为true的情况 vi mailtest.php<?php
function getHost($host)
{ //解析域名
$getHost = gethostbyname($host);
echo "尝试连接 $host ...<br>\r\n ";
if (!$getHost) {
echo "解析失败 (1)<HR>";
} elseif ($getHost == $host) {
echo "解析失败 (2): 可能是一个无效的主机名<HR>";
} else {
echo "域名解析为 $getHost ...<br>\r\n";
openHost($host);
}
}
function openHost($host)
{ //连接主机
if (function_exists('fsockopen')) {
$fp = fsockopen($host, 25, $errno, $errstr, 60);
} elseif (function_exists('pfsockopen')) {
echo "服务器不支持Fsockopen,尝试pFsockopen函数 ...<br>\r\n";
$fp = pfsockopen($host, 25, $errno, $errstr, 60);
} else
exit('服务器不支持Fsockopen函数');
if (!$fp) {
echo "代号:$errno,<br>\n错误原因:$errstr<HR>";
} else {
echo "SMTP服务器连接ok!<br>\r\n";
fwrite($fp, "");
$out0 = fgets($fp, 128);
#echo $out0;
foreach (["220"] as $port) {
if (strncmp($out0, $port, 3) == 0) { // 判断三位字符内容
echo $port . ' SMTP服务端响应正常<HR>';
} else {
echo $port . '服务器端错误<HR>';
}
}
}
}
//SMTP服务器地址
foreach (["smtp.163.com", "smtp.sina.cn", "smtp.sina.com", "smtp.qq.com", "smtp.126.com", "smtp.gmail.com"] as $host) {
echo getHost($host) . "\n\n\n";
}
if (function_exists('mail')) {
echo 'mail方法正常';
}
如果以上正常,那么就检查是否邮箱帐号的问题
php -r 'echo !extension_loaded('openssl')?"Not Available":"Available";';
执行结果
PHP Warning: Use of undefined constant openssl - assumed 'openssl' (this will throw an Error in a future version of PHP) in Command line code on line 1
后来发现把内容写入到php文件中执行正常的先查询配置文件路径
bash-4.4# php -i | grep cafile
openssl.cafile => no value => no value
创建ca文件, 把下载的CA文件的内容粘贴进去 [下载最新的CA cert文件](https://curl.haxx.se/ca/cacert.pem)
vi /etc/ssl/cacert.pem
修改php配置文件, 添加下面的内容
bash-4.4# vi /etc/php7/php.ini
openssl.cafile = /etc/ssl/cacert.pem
curl.cainfo = /etc/ssl/cacert.pem
判断是否开启openssl
php -m | grep openssl
如果没有开启,搜索php.ini下面内容, 把前面的;删除
extension=openssl
再次确认配置是否生效
bash-4.4# php -i | grep cafile
openssl.cafile => /etc/ssl/cacert.pem => /etc/ssl/cacert.pemMX记录
未设置或暂未生效参考链接: https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
情况是这样的, 用php写了个身份证签到客户端, 网页打开当前页面, 搜索传递的中文传递给本地程序, 本地程序在转换后发送给真实的接口, 其中中文名搜索出现了点小尴尬
本地客户端php就写了几个php文件, 接受参数都是直接用的 $_REQUEST['search_value'] 接收, 直接var_dump() 可以正常打印中文名, 但是转发请求调用接口就不行了, 且接收端做了处理了, 比如对收到的参数执行了 urldecode()
后来问题还是解决了, 本地的php发放在转发参数值, 需要将中文参数执行 urlencode() 对应的参数值即可 首先确定了跨域头是加好了的
这种情况下还是这样, 那么问题只有一种, 返回给前端的返回的body为空导致的