分类 php 下的文章

  • 1.xdebug配置

    • 1.1 xdebug扩展安装(xdebug3). 直接使用pecl命令安装是最快便捷的.
      pecl install xdebug
    • 1.2 xdebug配置(xdebug3).以下为几个必需常规配置.在php.ini中加入如下配置,然后记得重启服务.

      zend_extension=/usr/local/php7/lib/php/20170718/xdebug.so
      xdebug.mode=develop,debug,profile
      xdebug.client_host=host.docker.internal
      xdebug.client_port=9050#其实,你有多个项目(在不同docker里),都使用同个端口也是可以的,不同时使用即可
      xdebug.start_with_request=yes
      #以下为可选,配置了比较好看报错
      xdebug.log=/www/user.meiyan.com/logs/xdebug.log
      xdebug.output_dir=/www/user.meiyan.com/logs/xdebug_profiling_dir
  • 2.phpstorm配置

    • 2.1 在Preferences->PHP->Debug的xdebug部分的debug port填写第一步指定的端口,此例子为9050
    • 2.2 将docker中的文件和本地文件路径做好映射.

      • 一般在第一次请求进来时,就会弹出窗口让你配置映射.按提示配置好即可
      • 或者自行手动配置,路径在Preferences->PHP->Servers,添加一个服务端.主要填好host字段,还有目录映射(**注意:映射好根目录的映射后,
        可能还需要具体配置下入口文件index.php映射关系.若映射关系有问题,在debug弹窗面板中的xdebug的tab会有具体提示,按提示做好映射即可**)

    至此,即完成所有配置,能正常调试.是不是很简单~~

最近使用composer发现报如下错误:
`
[ComposerDownloaderTransportException]
The "https://packagist.org/packages.json" file could not be downloaded: SSL operation failed with code 1. OpenSSL Error messages:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
Failed to enable crypto
failed to open stream: operation failed
`

1: 下载certificate:
cd ~ && wget http://curl.haxx.se/ca/cacert.pem --no-check-certificate
2: Export it:
export COMPOSER_CAFILE='~/cacert.pem'
这个路径必需是第一步下载文件的位置
3: Run composer:
composer install

from: https://github.com/composer/composer/issues/3346#issuecomment-285460207

有时我们想这样访问数组$a的元素$varStr = "$a['a']['a_a']";.今天就做罗列下实现的两大类方法:
1.使用eval()

$varStr = "\$vars['a']['a_a']";
$value = eval("return $varStr;");

2.一层层遍历取值

$vars = function($str) use ($vars)
{
    if (!preg_match_all('#\[[\"\'](.+?)[\"\']\]#', $str, $keys)) {
        return null;
    }
    $var = $vars;
    foreach($keys[1] as $key){
        $var = $var[$key];
    }
    return $var;
};
$vars("['a']['aa']");//用法

#为了简洁,我们可以给他封装成一个函数
function initVar(&$vars)
{
    $vars = function($str) use ($vars)
    {
        if (!preg_match_all('#\[[\"\'](.+?)[\"\']\]#', $str, $keys)) {
            return null;
        }
        $var = $vars;
        foreach($keys[1] as $key) {
            $var = $var[$key];
        }
        return $var;
    };
}
//然后这样使用
initVar($vars);
$vars('["a"]["aa"]');

//或者封装成这样
function getValue($vars, $str)
{
    if (!preg_match_all('#\[[\"\'](.+?)[\"\']\]#', $str, $keys)) {
        return null;
    }
    $var = $vars;
    foreach ($keys[1] as $key) {
        $var = $var[$key];
    }
    return $var;
}
//然后这样使用
get($vars, '["a"]["aa"]');

参考:https://stackoverflow.com/questions/7003559/use-strings-to-access-potentially-large-multidimensional-arrays

php中处理xml格式的数据,一般都会用DOMDocument类.不过使用中发现往格式化的xml文件新增元素时新增元素没有被格式化(即有缩进换行). 解决办法也很简单,即是导入xml时,不要保留空白符.例子如下:

<?php
$doc = new \DOMDocument();
$doc->formatOutput = true;
$doc->preserveWhiteSpace = false;//这是关键
$doc->loadXML($xmlStr);
$doc->appendChild($doc->createElement('php', '666'))
$formattedXMLStr = $doc->saveXML();//格式化好的XML
echo $formattedXMlStr;
?>