初果实验室

  • PHP连接MySQL数据库

     PHP为什么要连接数据库呢?

    如果首次接触PHP,会有这样的疑问。

    当然,也可以不连接数据库,PHP程序也可以正常运行。

    PHP程序代码,只负责业务逻辑的处理,对于输入的数据进行计算并输出结果。

    比如,你给一段计算和值的代码输入1,2….10,程序计算完并返回结果55。

    此时,如果想把这个计算过程中,输入数据和输出数据存储下来,就需要数据库了。

    PHP可以连接哪些数据库?

    只要数据库和程序之间有相应的统一接口,就可以连接,常见的MySQL, PostgreSQL,SQL Server,Oracle,MongoDB,Redis都可以连接,其中以MySQL使用最为广泛。

    PHP程序如何与MySQL数据库交互?

    PHP与MySQL是互相独立的软件,两者若要进行数据交互,

    就必须相互暴露相关的API,这些API通常是基于各自源码开发的扩展程序。

    PHP与数据库进行数据交互,主要有以下三种扩展:

    1) mysql扩展

    2) mysqli扩展

    3) PDO_MYSQL扩展

    上面3种扩展都是基于PHP核心代码编写的扩展库, 都有对应的库函数和类。

    上面3种扩展连接数据库服务器,可以使用以下2种数据库驱动:

    1. MySQL Client Library [ libmysql ]
    2. MySQL Native Driver  [mysqlnd ]

    注意,这两个库是底层的,直接和数据库服务器交互的,没有提供PHP代码编程接口,是安装PHP的时候就指定的。

    php扩展-libmysql关系图[1]

    注意:

    自PHP5.4.x,默认的驱动由libmysql变为mysqlnd,自PHP 5.5.0 libmysql被废弃,自PHP 7.0.0 libmysql开始被移除,这是因为mysqlnd是由PHP官方发布的新一代驱动程序,之前的libmysql的由MySQL AB发布,从而规避了版权问题,这只是一方面的原因,mysqlnd是直接集成在PHP源码中的,使用PHP的内存管理系统,支持PHP的内存限制,比libmysql有更快执行速度和更少的内存使用率。

    PHP mysqlnd数据库驱动结构图

    php mysqlnd结构图[2]

    mysqlnd和libmysql在内存占用上的对比:

    limysql和mysqlnd在内存占用上的对比[3]

    可以看到,libmysql查询的数据在内存中存储了2份,而mysqlnd只存储了一份。

    使用mysqlnd,运行PHP的主机可以不用安装数据库,而之前使用libmysql这是必须的。

    mysqlnd还有更多特性,例如,增强的持续连接,SSL支持等,所以是时候抛弃libmysql了。

    PHP连接MySQL数据库代码示例:

    <?php
    // mysqli
    $mysqli = new mysqli("example.com", "user", "password", "database");
    $result = $mysqli->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
    $row = $result->fetch_assoc();
    echo htmlentities($row['_message']);
    
    // PDO
    $pdo = new PDO('mysql:host=example.com;dbname=database', 'user', 'password');
    $statement = $pdo->query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
    $row = $statement->fetch(PDO::FETCH_ASSOC);
    echo htmlentities($row['_message']);
    
    // mysql
    $c = mysql_connect("example.com", "user", "password");
    mysql_select_db("database");
    $result = mysql_query("SELECT 'Hello, dear MySQL user!' AS _message FROM DUAL");
    $row = mysql_fetch_assoc($result);
    echo htmlentities($row['_message']);
    ?>
    • mysqli扩展提供了丰富的面向对象编程模式来操作数据库的方式,比只支持函数式编程的mysql扩展好很多。
    • PDO方式虽然在编程上稍复杂一点,程序效率稍慢点,但是当业务的数据库类型变化时,基本上不用修改代码,因为它为各个不同的数据库定义了一个统一的接口。
    • mysql_connect方式的连接已经淘汰了。

    参考资料
    [1] http://jpauli.github.io/2014/07/21/php-and-mysql-communication-mysqlnd.html
    [2] http://jpauli.github.io/2014/07/21/php-and-mysql-communication-mysqlnd.html
    [3] Andrey Hristov <andrey@mysql.com>

  • PHP中constant用法举例

    如果define定义的常量的名字在程序中是个变量,可以使用constant()函数来获取常量的值。

    <?php
    defind('Windows_Browser', 'InternetExploer');
    defind('Mac_Browser', 'Safari');
    defind('Windows_Slide', 'PowerPoint');
    defind('Windows_Slide', 'Keynote');
    $os = 'Windows';
    $software = 'Slide';
    echo constant($os.'_'.$software);

     

     

  • WordPress图片存储优化插件Custom Media Path

    基于WordPress搭建的网站上传的图片,

    默认的存储目录结构为按月存储,例如

    wp-content/uploads/2017/07

    这样一个月内上传的图片,都会存储在同一个目录下,

    对于单月上传图片特别多的网站,

    图片的读写速度将会变慢,

    另外,WordPress会保留图片的原始名称,

    实际情况是很多图片名称冗长且编码混乱,

    这将导致图片的访问和一些代码不能正常运行,

    为了规避这个问题,可以每天新建一个目录,

    这样每个目录的文件数量就不会太大。

    另外,按一定规则重新命名上传的图片。

    以下插件,实现了上述功能,有需要的可以下载安装。

    https://github.com/hawktian/wordpress-custom-media-path

  • 使用youtube-dl下载youtube视频

    如果想下载youtube上面的视频,可以使用命令行工具youtube-dl

    https://rg3.github.io/youtube-dl/index.html

    在Windows/Linux/MacOS下都可以使用

    下面介绍Ubuntu上使用的方法

    sudo apt-get  install python-pip

    sudo pip install –upgrade youtube_dl

    安装完毕后,youtube-dl 后面跟下载的页面url即可。

    youtube-dl  https://www.youtube.com/watch?v=dtRgI0TG5uM

     

  • PHP函数set_exception_handler在各个版本中的差异

    PHP函数set_exception_handler用来设置用户自定义的异常处理函数,

    此函数的参数在PHP5和PHP7之间存在一些差异,

    PHP7对传入 exception_handler 的参数从 Exception 改为 Throwable

    <?php
    // PHP 5 写法
    function handler(Exception $e) { ... }
    set_exception_handler('handler');
    
    // 兼容 PHP 5 and 7
    function handler($e) { ... }
    
    // PHP 7 写法
    function handler(Throwable $e) { ... }
    ?>

    这个错误存在于Codeigniter 3.06以前的版本。

    参考资料:

    http://stackoverflow.com/questions/36982769/codeigniter-ci-exceptionsshow-exception-error-after-updating-to-php-7

    https://secure.php.net/manual/zh/language.exceptions.php

    https://github.com/bcit-ci/CodeIgniter/issues/4137

  • vim编辑器宏的使用

    通过宏可以将一组操作指令以自动化的方式重复执行指定的次数,从而提高编辑效率。

    如果能够合理利用,这种批处理的方式在实际的编码过程中非常有用。

    下面介绍宏的基本使用方法:

    0)  定义宏

    命令格式    q<letter><commands>q

    q    标明开始录制宏;

    <letter>输入一个a到z的字母,设置将宏存储在哪个暂存器;

    <commands>输入要执行的操作;

    q   标明 结束录制宏;

    举例:qa0gUwjjq    定义个一个名称为a的宏,它的指令集是0gUwjj,这个操作会使隔行的字母全部转换为大写字母。

    vim宏定义

    1) 查看宏

    命令格式    :reg <letter>

    举例:要查看刚才定义的宏a,输入:reg a就可以查看宏a的命令序列。

    查看定义的宏
    查看定义的宏

    2)执行宏

    命令格式    <number>@<letter>

    <number> 调用宏的次数;

    @ 开始执行宏;

    <letter> 要执行的宏名称;

    举例:在命令模式下直接输入 5@a 将刚才录制的宏a重复执行5次。

    调用已经定义的宏
    调用已经定义的宏

    3)保存宏

    宏默认会临时保存到.viminfo文件,此文件一般位于目录~【家目录】如果指定的暂存器内容未被覆盖,即便退出vim, 下次打开也依然可以调用。

    如果想永久保存录制的宏,可以将宏的定义添加到~/.vimrc配置文件中。

    例如将刚才录制的宏永久保存,编辑.vimrc文件,添加下面的行

    let @a=’0gUwjj’

    这样任何时候使用@a就可以调用宏了。( 编辑模式下依次按键Ctrl-R Ctrl-R a可以快速输入暂存器里面的内容)

    vim宏保存

    4)编辑宏

    如果录制的宏需要做一些临时修改, 在当前文件中,输入

    :let @a=’

    再依次按键 Ctrl-R Ctrl-R a自动补全宏指令集

    :let @a=’0gUwjj

    做出对应的修改,然后补全最后面的单引号即可

    :let @a=’03xgUwjj’

    这样之前的宏就修改为,先删除行首3个字符,在转化大小写

    调用宏依然使用@a命令

    此时可以输入:reg a 发现宏的内容已经被修改了

    5)宏应用简单示例

    宏实现了编辑操作的模式接口,只要自己能抽象出操作的共同指令集,就可以实现快捷强大的编辑操作,从而提高工作效率。

    a) 给多个行末尾添加分号

    let @a=’0A;^[j0′

    b) 多行注释代码

    let @a=’0i#^[j’

    c) 删除不规则长度的字符串

    let @a=’0t)hdi’j0′

  • css选择器first-child的使用

    设有如下HTML

    <div>
           <li>我是div的第一个孩子</li>
           <li>我是div的第二个孩子</li>
    </div>

    欲给第一个LI设定属性,可以写为:

    div li:fist-child{font-weight:bold;}
    

    需要注意的是,下面的写法是容易出现的错误。

    div:fist-child{font-weight:bold;}
    
  • git批量添加未跟踪代码命令

    git add $(git ls-files -o –exclude-standard) ​​​​

  • ubuntu 16.04 安装PHP Redis 扩展步骤

    git clone https://github.com/phpredis/phpredis.git
    cd phpredis
    git fetch origin
    git checkout php7
    phpize
    ./configure
    make && make install
    如果没有phpize,需要先安装

    apt-get install php7.0-dev

  • 网页开发利器之Chrome开发者工具简介

    使用谷歌浏览器 Chrome 浏览网页时,按下 F12 或者 Ctrl+Shift+I 或者在【设置/更多工具/开发者工具】中打开开发者工具。

    1) Elements  元素

    点击标签Elements,可以看见当前网页的源码结构,点击任何一个节点,可以查看当前标签以及它的父子兄弟元素,也可以直接编辑标签内容,为标签增加属性和内容等。
    右侧Styles列出了所有此标签引用的CSS样式,具体每一个样式是哪个文件定义的,样式是否有效都列了出来,同样也可以在这里直接增加删除修改样式,修改后的结果会实时的在页面上发生改变。
    Chrome开发者工具网页源码浏览和编辑
    Chrome开发者工具网页源码浏览和编辑

    右侧Computed列出了当前DOM元素的盒模型图示,以及最终的CSS样式值,因为每个标签的样式属性可能定义在多个文件多个片段中。

    右侧Event Listeners列出了当前选择的DOM节点上绑定的监听动作。

    Chrome元素浏览器查看DOM节点绑定的Javascript动作
    Chrome元素浏览器查看DOM节点绑定的Javascript动作
    Properties标签以树形结构列出了当前节点的原型属性。

    2)Console 控制台

    在这里可以执行任意的Javascript代码来调试页面,可以调用页面中的Javascript函数操作DOM。

    也可以在代码中使用下面列举的方法来记录调试日志和错误信息,这些信息是不会展示在页面上的,只有当打开控制台才可以看见。

    常用的console的方法:
    console.log() 基本记录
    console.error() 显示错误消息
    console.group() 和 console.groupEnd() 对消息进行分组显示
    console.assert() 显示条件性错误消息
    console.time() 和 console.timeEnd() 记录一段代码的时耗
    console.clear() 清除控制台记录
    console.count() 计数
    console.table() 以表格形式展示数据

    还有更多的方法不一而足,控制台使用时会有支持的函数自动完成提示。

    一些公司前端开发团队会在控制台这里发布招聘信息以便寻求人才。

    知乎在Chrome控制台发布的招聘信息
    知乎在Chrome控制台发布的招聘信息

    3)Sources 资源

    这个栏目以树状结构列举出来当前页面加载的所以页面要素,包括HTML/CSS/Javascript以及图片资源。

    可以查看当前页面加载的所有文件资源的源码,也可以在Javascript文件中设置断点方便调试。

    Chrome查看页面资源和设定调试断点
    Chrome查看页面资源和设定调试断点

    4 ) Network 网络

    此栏目会记录页面的所有的网络请求, 请看下图的标注说明:

    Chrome开发者工具网络请求栏目说明
    Chrome开发者工具网络请求栏目说明

    可以看到,网络捕获功能十分强大,可以记录所有发出的请求的HTTP详情,可以按条件过滤需要特别关心的请求,可以定位加载时候有问题的资源, 可以看到时延的时间,可以看到HTTP数据包的详细内容。

    5 ) Performance 性能

    分析运行时性能,这个属于比较高级的功能,如果Javascript出现卡顿,视差滚动,页面不够流畅时可以使用这个功能,分析器可以在函数级别上找到开销大的代码,建议在匿名模式下去分析,这样可以避免安装的插件带来的外部影响。这里列举出Google官方给出的建议:

    *)不要编写会强制浏览器重新计算布局的 JavaScript。将读取和写入功能分开,并首先执行读取。
    *)不要使您的 CSS 过于复杂。减少使用 CSS 并保持 CSS 选择器简洁。
    *)尽可能地避免布局。选择根本不会触发布局的 CSS。
    *)绘制比任何其他渲染活动花费的时间都要多。请留意绘制瓶颈。

    6)Applications  应用

    这个栏目可以查看Manifest,离线缓存等信息,可以浏览和修改Cookie信息。

    Chrome开发者工具查看Manifest和Cookie信息
    Chrome开发者工具查看Manifest和Cookie信息

    综上所述,Chrome开发者工具的功能非常强大,本文只是浅显的做了介绍,还有更多更专业的功能需要读者发现和使用,掌握好这个工具,程序的开发调试工作便如虎添翼,简化工作复杂度,提高工作效率!