标签: php

  • 如何给WordPress网站添加Javascript代码

    直接修改主题文件,主题一升级,代码就没有了。

    其实可以通过插件来引入Javascript代码。

    WordPress提供了函数 wp_enqueue_script 和钩子 wp_enqueue_scripts 。

    以方便开发者管理Javascript代码。

    添加的方法步骤:

    在插件目录下新建一个目录,进入目录后新建一个插件文件index.php,插入如下示例代码:

    <?php
    /*
    Plugin Name: custom javascript
    Description: Add custom javascript
    */
    function add_custom_scripts() {
    wp_enqueue_script( 'jquery-ui', 'https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js', array(), '1.12.1', false);
    }
    add_action( 'wp_enqueue_scripts', 'add_custom_scripts' );

    wp_enqueue_script 函数五个参数说明

    1. string $handle #对当前引入的javascript文件的代号

    2. string $src = ” #javascript代码资源url

    3. array $deps = array() #依赖得代码,就是参数1中handle的值

    4. string|bool|null $ver = false #版本号,如果未指定,与WordPress系统版本号一致

    5. bool $in_footer = false #是否在文档底部,如果是false,则默认在文档头部就载入

    最后保存文件,去插件中心激活插件,在浏览器页面查看页面源代码,就可以看到引入的 javascript 文件了。

    使用 wp_enqueue_script 函数有以下优点:

    a. 可以设定与其他依赖代码的载入次序

    b. 可以指定版本号利于让客户端的缓存失效

    c. 可以指定嵌入代码在文档的位置

    另外还有一个函数 wp_script_add_data

    这个函数用来给你添加的javascript文件设定metadata

    例如,添加下面的谷歌广告的代码:

    <script data-ad-client="pub-123456789" async src="https://pagead2.googlesyndication
    .com/pagead/js/adsbygoogle.js"></script>

    应该按如下的方式来添加

    <?php
    
    wp_enqueue_script( 'google_adsense', 'https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js', array(), false, false);
    
    wp_script_add_data( 'google_adsense', 'data-ad-client', 'pub-123456789' );

    参数说明:

    wp_script_add_data( string $handle, string $key, mixed $value )

    1> handle wp_enqueue_script函数定义的值

    2> key  script标签的meta key

    3> value script标签的meta value

    参考资料
    https://developer.wordpress.org/reference/functions/wp_enqueue_script/
    https://developer.wordpress.org/reference/functions/wp_script_add_data/

  • 使用TinyMCE增强WordPress编辑器功能

    尽管目前WordPress默认的编辑器是Gutenberg,但是很多人还是习惯经典编辑器。

    TinyMCE是一款开源的、多功能的、羽量级的、易用的、所见即所得编辑器,浏览器端部署,被业界广泛使用。同样,WordPress也可以轻松集成TinyMCE的出色功能:创建表格多选项的列表查找和替换设置字体集和字体大小和颜色,撤销操作等功能。

    原始编辑器

    安装TinyMCE Advanced插件后的编辑器

    插件下载地址:https://wordpress.org/plugins/tinymce-advanced/

    TinyMCE兼容Gutenberg编辑器。

  • phpMyAdmin免输入密码登录

    通过将MySQL的用户名和密码存储在 phpMyAdmin 的配置文件中,

    就可以快捷登录 phpMyAdmin

    免除输入密码的步骤,

    当然最好是部署在内网,

    否则将存在很大安全隐患。

    配置步骤

    1> 复制 config.sample.inc.php 为 config.inc.php

    2> 修改代码示例:

    /**
     * Second server
     */
    $i++;
    /* Authentication type */
    $cfg['Servers'][$i]['auth_type'] = 'config';
    /* Server parameters */
    $cfg['Servers'][$i]['host'] = 'localhost';
    $cfg['Servers'][$i]['user'] = '';
    $cfg['Servers'][$i]['password'] = '';
    $cfg['Servers'][$i]['compress'] = false;
    $cfg['Servers'][$i]['AllowNoPassword'] = false;

    其中 auth_type 由原来的 cookie 修改为 config

    第9行和10行增加了 user 和 password 的配置

    将用户名和密码写入代码中

    在登陆界面选择服务器后点击执行

    无需填写用户名和密码就可以登录 phpMyAdmin 了

  • phpMyAdmin连接远程服务器配置

    phpMyAdmin登陆界面默认的MySQL服务器只有localhost

    如果想连接其他服务器上的MySQL

    此时只需要在config.inc.php中增加配置就可以了

    首先复制文件 config.sample.inc.php 为 config.inc.php

    然后找到下面的代码片段

     

    /**
     * First server
     */
    $i++;
    /* Authentication type */
    $cfg['Servers'][$i]['auth_type'] = 'cookie';
    /* Server parameters */
    $cfg['Servers'][$i]['host'] = 'localhost';
    $cfg['Servers'][$i]['compress'] = false;
    $cfg['Servers'][$i]['AllowNoPassword'] = false;

    复制为

    /**
     * Second server
     */
    $i++;
    /* Authentication type */
    $cfg['Servers'][$i]['auth_type'] = 'cookie';
    /* Server parameters */
    $cfg['Servers'][$i]['host'] = '192.168.1.11';
    $cfg['Servers'][$i]['compress'] = false;
    $cfg['Servers'][$i]['AllowNoPassword'] = false;

     

    注意第8行,新增加的数据库服务器地址为 192.168.1.11

    这样在登录界面就可以看到新增加的服务器了。

    操作视频

    https://www.bilibili.com/video/BV1Ji4y177xc/

  • 基于Ubuntu 20.04 部署phpMyAdmin

    phpMyAdmin是一套优秀的基于WEB的MySQL数据库管理系统, 当需要编写SQL语言和数据库交互时,可以通过phpMyAdmin来替代完成工作,减少错误发生,提高生产效率。

    phpMyAdmin自身使用PHP语言开发,所以部署依赖PHP WEB环境,以下视频示范在全新的Ubuntu 20.04系统上部署PHP7.4/MySQL/Nginx/phpMyAdmin的过程。

    视频地址:

    https://www.bilibili.com/video/BV1Qk4y1B7jB/

    下面是操作执行命令的步骤:

    修改root 密码
    sudo passwd root
    
    切换到root用户
    su root
    
    apt update
    apt install nginx
    apt install mysql-server
    
    mysql
    修改root@localhost的密码
    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'sqlpwd345';
    刷新权限
    flush privileges;
    quit
    
    apt install php7.4
    apt install php7.4-fpm
    apt install php7.4-curl
    apt install php7.4-mysql
    wget https://files.phpmyadmin.net/phpMyAdmin/5.0.2/phpMyAdmin-5.0.2-all-languages.zip
    apt install unzip
    unzip phpMyAdmin-5.0.2-all-languages.zip
    让nginx支持PHP脚本处理
    vim /etc/nginx/sites-available/default
    service php7.4-fpm start
    service nginx start
    service mysql start
  • 基于AWS EC2创建Ubuntu 20.04实例

    基于AWS EC2创建Ubuntu 20.04实例
    这个演示全部使用的是默认选项,适合作为学习使用
    需要注意的是:
    ubuntu系统默认的用户名是ubuntu,不是root
    如果实例是基于原生系统,又没有密钥的话,必须创建一个,否则无法登录
    如果实例是基于AMI,那么登录方式取决于AMI的设定,此时不一定需要创建密钥对
    密钥对不是免费的,每月收费1美金的保管费

  • Ubuntu 16.04.2 LTS php7.2 安装 redis 扩展

    参考文章

    https://www.cnblogs.com/zzming/p/10018096.html

    wget http://pecl.php.net/get/redis-4.2.0.tgz
    
    tar -xzvf redis-4.2.0.tgz
    
    cd redis-4.2.0
    
    phpize7.2
    
    ./configure --with-php-config=/usr/local/php7.2/bin/php-config
    
    make && make install
    
    extension=redis.so >> /etc/php/7.2/fpm/php.ini
  • Ubuntu 16.04 LTS 安装php7.2

    因项目要使用到Laravel,但Laravel要求php >= 7.1.3

    我的本地系统为 Ubuntu 16.04.4 LTS ,php版本为7.0

    当前php7.2已经有稳定版本发布,所以计划直接升级到php7.2

    因php7.2版本比较新,并未收录在ubuntu 16.04.4 LTS 默认的软件包里面

    所以就需要添加PPA(Personal Package Archives)

    以下是添加和安装的步骤:

    sudo apt-get update
    
    sudo apt-get install python-software-properties
    
    sudo apt-get install software-properties-common
    
    add-apt-repository ppa:ondrej/php
    
    apt-get install -y php7.2

    参考文档

    https://tecadmin.net/install-php-7-on-ubuntu/
    https://www.liquidweb.com/kb/install-php-7-2-ubuntu-16-04/

    安装基础扩展

    apt install php7.2-fpm

    apt install php7.2-mbstring

    apt install php7.2-mysql

    安装redis扩展

    某些系统由于语言问题安装不成功的解决办法:

    locale-gen en_US.UTF-8
    export LANG=en_US.UTF-8
    export LC_ALL=en_US.UTF-8

    问题讨论:https://github.com/oerdnj/deb.sury.org/issues/56

  • WordPress上传图片出错常见原因分析

    WordPress上传图片出错常见原因分析,以Linux/Ubuntu 16.04 LTS 操作系统为例说明。

    1.  目录权限问题

    如果PHP进程所属用户没有 uploads 目录的写权限,上传就会失败。

    可以使用命令 ps -ef | grep fpm 来查看,默认的用户名一般是 www-data

    然后使用命令 ls -l 查看图片存储目录的属主和权限

    如果目录属主不一致,使用 chown www-data:www-data uploads -R 将uploads的所属用户和所属用户组修改为www-data

    如果目录不可写,使用 chmod 0777  uploads -R 将uploads的目录权限修改为可写,

    当php-fpm进程和uploads目录所属用户一致,并且开放了写权限,就规避了无法写入的问题。

    当然,也不一定要求两者所属用户一致,uploads目录开放了其他用户的写权限,php-fpm进程也是可以写入的。

    2. PHP配置参数原因

    php 通过两个参数来控制客户端发送数据包的大小,分别是 post_max_size upload_max_filesize

    post_max_size 设置了客户端向服务端发送数据的大小,

    upload_max_filesize 设置了上传文件的最大值,

    具体的大小,可以通过phpinfo()函数来查看,上传的媒体文件大小如果超过了这两个值,就会出现错误,

    在phpinfo()函数页面,找到Loaded Configuration File对应的文件,就是当前运行环境的配置文件,

    将其值修改为期望的大小,然后重启php-fpm进程就可以了。

    service php7.0-fpm restart

    3. Nginx/Apache配置参数原因

    以Nginx为例,为了保证服务器稳定,也有一个默认的限制发送来的HTTP数据包大小的配置参数  client_max_body_size

    通常这个配置并未出现在Nginx的配置文件里面,但是如果遇到Nginx 报 413  Request Entity Too Large Error这样的错误,就说明请求的数据内容超出了限制。

    如果要自定义这个参数,只需在 Nginx 的配置文件/etc/nginx/nginx.conf里面的http{….}之间添加一行代码

    client_max_body_size 10M;

    这样就把上传文件的大小设置为最大10M了

    然后执行下面的命令重新载入 Nginx 的配置即可生效

    service nginx reload

    以上3点是遇到WordPress不能上传图片或者媒体文件时应该注意的地方。

     

  • 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>