分类 php_problem 下的文章

  • in_array 踩坑
如果写法 in_array('*',$arr);  这种写法是错误的, 如果 $arr=[0]; 该判断就为true了
正确写法 !empty(array_instract(["*"],$arr)); 通过判断交集是否为空来判断更准确, 避免数组中包含 0 时导致字符串in_array都为true的情况 

  • 创建php文件并执行测试 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方法正常';
}

如果以上正常,那么就检查是否邮箱帐号的问题

  • 查看是否开启openssl
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文件中执行正常的
  • 未配置CA证书的情况
先查询配置文件路径
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.pem
  • 最终还是查到了原因, 配置的域名邮箱的域名解析的关联mx值丢失导致的
MX记录
未设置或暂未生效

参考链接: https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting

情况是这样的, 用php写了个身份证签到客户端, 网页打开当前页面, 搜索传递的中文传递给本地程序, 本地程序在转换后发送给真实的接口, 其中中文名搜索出现了点小尴尬

本地客户端php就写了几个php文件, 接受参数都是直接用的 $_REQUEST['search_value'] 接收, 直接var_dump() 可以正常打印中文名, 但是转发请求调用接口就不行了, 且接收端做了处理了, 比如对收到的参数执行了 urldecode() 

后来问题还是解决了, 本地的php发放在转发参数值, 需要将中文参数执行 urlencode() 对应的参数值即可