Author: admin

启用mysqli报告,捕获PHP程序中未使用索引的查询语句.

启用mysqli报告,捕获PHP程序中未使用索引的查询语句.

使用mysqli_report($flags)函数

在代码开发和测试期间有助于改进查询的函数。根据标志,它报告来自mysqli函数调用或不使用索引的查询(或使用错误索引)的错误。

代码如下

<?php
/* 激活报告 */
mysqli_report(MYSQLI_REPORT_ALL);

$link = mysqli_connect("localhost", "my_user", "my_password", "world");

/* 检查连接 */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

/* 此查询会报告错误 */
$result = mysqli_query("SELECT Name FROM Nonexistingtable WHERE population 
        

composer :错误:Could not find a version of package matching your minimum-stability (stable). Require it with an explicit version constraint allowing its desired stability

composer 安装 composer require --dev sandrokeil/php-to-zephir 时出现

Could not find a version of package matching your minimum-stability (stable). Require it with an explicit version constraint allowing its desired stability

解决方法:https://github.com/composer/composer/issues/5118

用以下命令解决:

composer require "sandrokeil/php-to-zephir @dev"

PHP 在不调用构造函数的情况下创建对象

PHP 在不调用构造函数的情况下创建对象

可以利用PHP的反射功能ReflectionClass :: newInstanceWithoutConstructor,实现这一需求。

例子:

<?php
class a
{
    public $foo=0;
    public $bar=9;
    public function __construct()
    {
        $this->foo=1;
        echo "调用构造函数\n";
    }
}
  
  $ref = new ReflectionClass('a');
  $inst = $ref->newInstanceWithoutConstructor();
  print_r($inst);

 

以上输出:

a Object
(
    [foo] => 0
    [bar] 
    

漫谈php框架之中间件

市面上常见的php框架有很多,最近因为有技术需求,所以对常见的php框架的中间件进行了一些了解。各个框架尽管在目标上对php框架的定义大同小异,但是在实现方式上却各有不同,且看下文:

定义

首先什么是php的中间件?

根据zend-framework中的定义:

所谓中间件是指提供在请求和响应之间的,能够截获请求,并在其基础上进行逻辑处理,与此同时能够完成请求的响应或传递到下一个中间件的代码。

这一介绍十分的简洁,但却略显抽象,接下来我们通过例子来一个个看。

处在原始时代的CI

首先来看CI框架,php star数 12830.
作为一款非常简洁的框架,CI被吐槽的不少,但是也有很多人喜欢。首先来看它官方给出的一张请求时序图:

CI框架请求时序

CI框架请求时序

根据上文中对中间件的定义,那么对于CI框架来说,唯一称得上是内置中间件的:Security模块

Security模块是在请求进入controller之前实现的逻辑:

  • 请求在完成路由之后,进入controller之前;
  • CI框架支持通过配置的方式,决定是否启用包括“URI安全、XSS过滤、CSRF保护”在内的功能模块;
  • 一旦框架初始化时探测到模块启用,那么优先进行模块逻辑;
  • 触发安全模块,请求即告终止。

乍看起来,CI框架的中间件十分的局限,但是其实它却提供了无限的可能性。。因为CI中还提供了一个叫做Hooks的功能。即钩子。

下面来看两个个hooks的例子:

定义一个在controller逻辑之前的钩子,并指定钩子的参数、类名或函数名信息:

$hook['pre_controller'] = array(
    'class'    => 'MyClass',
    'function' => 'Myfunction',
    'filename' => 'Myclass.php',
    'filepath'
    

PHP的SimpleXML遍历所有子元素及访问特定节点元素和属性

PHP的SimpleXML遍历所有子元素

    

linux后台执行命令(非阻塞):&和nohup

当我们在终端或控制台工作时,可能不希望由于运行一个作业而占住了屏幕,因为可能还有更重要的事情要做,比如阅读电子邮件。对于密集访问磁盘的进程,我们更希望它能够在每天的非负荷高峰时间段运行(例如凌晨)。为了使这些进程能够在后台运行,也就是说不在终端屏幕上运行,有几种选择方法可供使用。

  • &
    当在前台运行某个作业时,终端被该作业占据;可以在命令后面加上& 实现后台运行。例如:sh test.sh &
    适合在后台运行的命令有f i n d、费时的排序及一些s h e l l脚本。在后台运行作业时要当心:需要用户交互的命令不要放在后台执行,因为这样你的机器就会在那里傻等。不过,作业在后台运行一样会将结果输出到屏幕上,干扰你的工作。如果放在后台运行的作业会产生大量的输出,最好使用下面的方法把它的输出重定向到某个文件中:
        

用strace查找进程卡死原因

最近遇到进程卡死的情况,但是自己调试的过程中并不一定能复现,都是需要运行一段时间某些条件下才会触发,对于这种运行着不能破坏现场的情况,我们可以使用gdb -p和strace -p来跟踪。
首先我们用ps auxf查看我们的进程执行到了哪一步:

 

可以看到执行到了docker exec -i 178.20.1.229_0115034556 ls然后就卡死了
然后我们进一步通过strace查看执行这个操作死在哪个系统回调了: …