「Java」- 虚拟机指令

tableswitch 0xaa(170)
用于switch条件跳转,case的值是连续的(可变长度指令)
tableswitch
<0-3 byte pad> ———————– 使得defaultbyte1与方法的的起始地址之间的距离正好是4的倍数。
defaultbyte1 ———————– 默认的跳转地址。 defaultbyte2 defaultbyte3 defaultbyte4
lowbyte1 ——————— case语句中的最小值。 lowbyte2 lowbyte3 lowbyte4
highbyte1 ———————- case语句中的最大值。 highbyte2 highbyte3 highbyte4
jump offsets… ———————- 零基址跳转表。
32位值的计算方法为(byte1 << 24) | (byte2 << 16) | (byte3 << 8) | byte4 。
index – low + tableswitch的地址 = 跳转地址
Operand Stack
…, index → …[……]

READ MORE

「Java」- 混淆器

Zelix KlassMaster
官网:https://www.zelix.com/klassmaster/index.html[……]

READ MORE

「jarwrapper」

安装

#!/bin/bash

# Kali GNU/Linux Rolling
apt-get install jarwrapper[……]

READ MORE

「Java」- Dynamic Proxy

动态代理模式主要由四个元素共同构成:
  1. 接口,接口中的方法是要真正去实现的
  2. 被代理类,实现上述接口,这是真正去执行接口中方法的类
  3. 代理类,实现InvocationHandler,帮助被代理类去实现方法
  4. 测试用例:
代码示例

接口:

public interface Person {
void searchHouse();
}

被代理类Master,实现上述接口:

public class Master implements Person {
void searchHouse(){
System.out.println(“I’m Mater.”);
};
}

代理类HomeLine,实现InvocationHandler接口

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class HomeLink implements InvocationHandler{

private Person target;

public Object getInstance(Person target){
this.target = target;
Class clazz = target.getClass();

return Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);
}

@Override
public Object invoke(Object obj, Method method, Object[] args) throws Throwable {
System.out.println(“HomeLink Start…”);
//第一个参数是target,也就是被代理类的对象;第二个参数是方法中的参数
method.invoke(target, args);
System.out.println(“HomeLink End…”);

return null;
}
}

4.测试用例:

public class TestSearchHouse {
public static void main(String[] args) {
Person person = (P[……]

READ MORE

「Java」- MD5

Java Secure Hashing – MD5, SHA256, SHA512, PBKDF2, BCrypt, SCrypt

public String md5(String passwordToHash) {
MessageDigest md = MessageDigest.getInstance(“MD5”);
md.update(passwordToHash.getBytes());
byte[] bytes = md.digest();

StringBuilder sb = new StringBuilder();
for(int i=0; i< bytes.length ;i++) {
sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
}

return sb.toString();
}[……]

READ MORE

「java.util.prefs.Preferences」

作用
Properties提供的应用程序解决方案主要存在两个问题:
(1)配置文件不能放在主目录中,因为某些OS(如Win9X)没有主目录的概念;
(2)没有标准的文件命名规则,存在文件名冲突的可能性。
Java中的Preferences类可以解决这些问题。Preferences提供一个存储配置信息的中心知识库,与平台无关。
Preferences的中心知识库是树状结构,因此可以避免文件名冲突。每个用户都有一棵树,存放与本用户有关的配置;还有一个系统树,存放全体用户的公共信息。内部的配置信息仍然以key-value的结构进行存储。
使用方法
Preferences的使用步骤如下:
(1)获得根节点
Preferences root = Preferences.userRoot();
Preferences root = Preferences.systemRoot();
如果配置信息位于用户树,则获取用户树的根节点,否则获取系统树根节点;
(2)获取配置节点
preferences = root.node(“path”);
path是配置节点相对于根节点的路径;
如果节点的路径名与类的包名相同,则可通过类的对象直接获得配置节点:
Preferences node = Preferences.userNodeForPackage(this.getClass()); Preferences node = Preferences.systemNodeForPackage(this.getClass());
(3)读取配置项
String title = preferences.get(“title”, “default title”);
Preferences要求读取配置项时必须指定默认值。因为在实际环境中总会有各种不如意,比如系统中还没有中心知识库,或者网络暂时不可用等等。
(4)设置配置项
preferences.put(key, value);
(5)同步配置项
preferences.flush();
flush()方法用于立即将配置项写入到文件中。
示例
JDK1.4为我们提供的java.util.prefs包,里面有一个Preferences类,能让以上的工作变得极其轻松! 写VB程序的人常常用SaveSetting函数和getSettging来存取注册表中的用户设定数据。而Java的Preferences类也提供了类似的机制。 Preferences类在不同的平台中有不同的实现方式。而在Windows平台中,Preferences是将数据保存在注册表中的,[……]

READ MORE

「Markdown」

解决方案
标题:# ## ### #### ##### ######
代码:`This is code.`
链接:[a link to example.com](http://example.com)
参考文献
Wikipedia/Markdown daringfireball.net/projects/markdown Markdown基本语法[……]

READ MORE

「PHP」-安装

在 GNU/Linux 下,使用PHP源码编译安装
这里以php-5.6.31为例

#!/bin/bash
./configure \
–prefix=/usr/local/php-5.6 \
–with-config-file-path=/usr/local/php-5.6/etc \
–with-config-file-scan-dir=/usr/local/php-5.6/etc/php.ini.d \
–localstatedir=/var \
–enable-fpm \
–with-zlib \
–enable-bcmath \
–with-bz2 \
–enable-calendar \
–enable-dba=shared \
–with-gdbm \
–with-gettext \
–with-gd \
–with-freetype-dir=/usr \
–with-jpeg-dir=/usr \
–with-png-dir=/usr \
–enable-gd-native-ttf \
–with-pdo-mysql \
–with-mysql \
–with-mysqli \
–with-curl

#
# 这只是一个示例,有些扩展单独安装也可以,比如curl、mysql等。
#
# –with-config-file-scan-dir: 指定配置文件的扫描目录,这样可以将ini的配置分模块进行配置,从而可以不、维护一个很长的php.ini文件。
#
# –with-config-file-path: 指定php.ini文件的查找路径,默认查找路径为PREFIX/lib(参考configure –help)
#

在macOS中,编译安装PHP 5.6.35
安装目录为/gnu,PHP 5.6的编译选项如下:

#!/bin/bash
./configure \
–prefix=/gnu \
–localstatedir=/gnu/var \
–sysconfdir=/gnu/etc/php/5.6 \
–with-config-file-path=/gnu/etc/php/5.6 \
–with[……]

READ MORE

「php-config」

php-config,该命令用于获取已经安装的PHP的配置及编译选项。该命令是一个SHELL脚本。
命令行语法格式
php-config [options]
如果没有指定[options],则会列出所有的配置选项。
命令支持的选项及含义
–prefix PHP所安装的目录前缀。比如:/usr/local
–includes 编译时-I选项的参数列表,包含了所有的include文件。
–ldflags PHP在编译时使用的链接标志。
–libs PHP在编译时使用的额外库。
–man-dir 手册所在的路径。
–extension-dir 扩展搜索时的默认路径。
–include-dir 头文件的安装默认位置。
–php-binary PHP的CLI或者CGI二进制文件的路径。
–php-sapis 显示所有可用的SAPI模块。
–configure-options 用于重建当前已安装PHP配置的配置选项。编译当前安装的PHP时使用的编译选项。
–version PHP版本号。
–vernum 整数类型的PHP版本。
输出示例
在GNU/Linux中

在MacOSX中

# /usr/local/opt/php@5.6/bin/php-config
Usage: /usr/local/opt/php@5.6/bin/php-config [OPTION]
Options:
–prefix [/usr/local/Cellar/php@5.6/5.6.35_1]*
–includes [-I/usr/local/Cellar/php@5.6/5.6.35_1/include/php -I/usr/local/Cellar/php@5.6/5.6.35_1/include/php/main -I/usr/local/Cellar/php@5.6/5.6.35_1/include/php/TSRM -I/usr/local/Cellar/php@5.6/5.6.35_1/include/php/Zend -I/usr/local/Cellar/php@5.6/5.6.35_1/include/php/ext -I/usr/local/Cellar/php@5.6/5.6.35_1/include/php/ext/date/lib]
–ldflags [ -L/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Devel[……]

READ MORE

「php-fpm」-

PHP的FastCGI进程管理器。
命令行语法格式
php-fpm [options]
命令描述
PHP is a widely-used general-purpose scripting language that is especially suited for Web development and can be embedded into HTML. This is a variant of PHP that will run in the background as a daemon, listening for CGI requests. Output is logged to /var/log/php-fpm.log.
Most options are set in the configuration file. The configuration file is /etc/php-fpm.conf. By default, php-fpm will respond to CGI requests listening on localhost http port 9000. Therefore php-fpm expects your webserver to forward all requests for ‘.php’ files to port 9000 and you should edit your webserver configuration file appropriately.
命令行选项及含义
配置相关选项
-C 不要更改目录到脚本的目录
–php-ini path|file / -c path|file 使用指定的php.ini文件,或者在指定的目录中查找php.ini文件。
–fpm-config file / -y 指定PHP-PFM配置文件的位置。默认/etc/php/php-fpm.conf文件
–test / -t 测试FPM配置文件。如果使用了两次该选项(-tt),则会dump配置文件的信息。
–no-php-ini / -n 不使用php.ini文件。
–define foo[=bar] / -d foo[=bar] 定义INI实体:foo=bar
运行相关选项
-e 生成用于Debug/性能分析的扩展信息。
-p 指定可替换的前缀路径。默认/usr/local。
–pid file / -g 指定PID问家的位置。
–daemonize / -D 强制运行在后台,并忽略配置文件中的守护进程相关的配置。
–nodaemonize / -F 强制在前台运行,并忽略[……]

READ MORE

「php」

–interactive,-a 以交互的方式运行PHP。直接执行输入的PHP代码片段。当启用readline支持时,还可以编辑这些行,并且还具有历史记录支持,TAB补全等功能。如下所示,在命令行中执行php -a命令,进入交互SHELL:

# /usr/local/php-5.6/bin/php -a
Interactive mode enabled

php > var_dump(array([‘c1’ => ‘red’]));
array(1) {
[0]=>
array(1) {
[“c1”]=>
string(3) “red”
}
}

如上示例,php >为提示符。我们在交互模式中执行PHP代码var_dump(array([‘c1’ => ‘red’]));,这与在PHP脚本中执行是类似的。
注意,如果你的PHP没有readline模块,是无法进入交互SHELL的,只能进入交互模式,在交互模式下是没有php >提示符的。有关交互模式与交互SHELL的区别参考PHP笔记。[……]

READ MORE

「nil」- 3.Quick Start and Tutorial

内容简介

章节列表
「PHP 标记种类」 「continue」 「PHP」数据库扩展安装 「PHP」- 连接SQL Server数据库 「php-mysql-cert」 「PHP」- include[_once] / require[_once][……]

READ MORE

「在PHP中,自定义类加载器」

内容:主要介绍类文件的自动加载;
看了德问社区的一个类似问题:http://www.dewen.net.cn/q/9824
文档中关于类自动加载的说明:http://php.net/manual/zh/language.oop5.autoload.php
使用__autoload方法
http://php.net/manual/en/function.autoload.php
void __autoload ( string $class )
如果类不存在会自动调用autoload($class)方法,通常 autoload() 需要开发者自己实现;
注意事项 就目前(03/06/2017)来讲,根据官方文档的描述不再建议使用__autoload()函数。因为这个不灵活,不过依然包含在PHP7中,建议使用spl_autoload_register;
使用spl_autoload_register方法
http://php.net/manual/en/function.spl-autoload-register.php
spl_autoload_register() 提供了一种更加灵活的方式来实现类的自动加载。因此,不再建议使用autoload()函数,在以后的版本中autoload()函数可能被弃用。
当类不存在的时候会自动加载“注册方法”,Demo:

<?php

// register 方法需要开发者自己实现;
function my_autoloader($class) {
include ‘classes/’ . $class . ‘.class.php’;
}

spl_autoload_register(‘my_autoloader’);

但是实际中,我不是这么用的,我的类加载器使用了 spl_autoload 方法。
使用spl_autoload方法
http://php.net/manual/en/function.spl-autoload.php
function spl_autoload ($class_name, $file_extensions = null) {}
在默认情况下,本函数先将类名转换成小写,再在小写的类名后加上 .inc 或 .php 的扩展名作为文件名,然后在 include paths 中检查是否存在该文件。(有的时候你会发现php真的很php。怪不得类名那么奇怪。);
我的类加载器:

<?php
// 已省略部分非核心代码;

// register
function mClassLoader($class){
$classFil[……]

READ MORE

「PHP」- 连接数据库

参考文献
php/Vendor Specific Database Extensions

章节列表
「php-mysql-cert」 「PHP」数据库扩展安装 「PHP」- 连接SQL Server数据库[……]

READ MORE

「PHP」数据库扩展安装

关于pdo、mysqli、mysql、mysqlnd、mysql client library之间的关系有的时候很容易记混乱。
PHP与MySQL:PDO、MySQLi、MySQL、Mysqlnd、MySQL Client Library之间的关系
MySQL – PHP’s MySQL Extension 用于PHP应用程序与MySQL数据库交互。 MySQL扩展提供了一个程序接口,这些接口适用于4.1.3以前的MySQL版本。此扩展可以与MySQL 4.1.3或更高版本一起使用,但并不是支持所有的最新的MySQL服务器功能。
MySQLi – MySQL Improved Extension MySQLi,有时也被称为MySQL增强扩展。MySQLi扩展是对PHP MySQL扩展的增强,有很多好处:

面向对象;
支持预处理语句;
支持多重语句;
支持事务;
增强调试功能;
嵌入式服务器支持;

注意:如果使用MySQL 4.1.3或更高版本,强烈建议使用此扩展。
PDO – PHP Data Objects 这里的PDO指的是PDO_MySQL。 PDO是专门用于PHP应用程序的数据库抽象层,PDO为PHP应用程序提供一致的数据库访问API。如果使用了PDO API,无论应用程序连接的是什么数据库,只需对PHP代码进行微小的更改即可以切换到别的数据库服务器。
Mysqlnd MySQL Native Driver is written in C as a PHP extension. MySQL Native Driver is a replacement for the MySQL Client Library (libmysqlclient).
MySQL Client Library(libmysqlclient) 由MySQL数据库提供的驱动程序。通常在MySQL的包中。
关于pdo、mysqli、mysql、mysqlnd、mysql client library之间关系如下表:

角色
成员
描述

PHP开发者
mysql_connect、query等函数调用
应用开发者层,相关的函数调用。

PHP访问数据库的API
pdo、mysqli、mysql
提供数据库操作API,函数库。

Low Level
mysql native drive(mysqlnd)、mysql client library
数据库驱动[……]

READ MORE

「PHP」- 连接SQL Server数据库

在PHP中,如果要连接SQL Server数据库,可以使用以下几种驱动:

Mssql
PDO_SQLSRV (Windows only)
PDO_ODBC
SQLSRV (Windows only)
Unified ODBC API

上述内容是复制于官网(03/11/2019)。
但是,实际情况会更复杂一些,尤其是PDO_SQLSRV与SQLSRV,它俩不光是Windows only的。
# SQLSRV – Microsoft SQL Server Driver for PHP
SQLSRV: http://php.net/manual/en/book.sqlsrv.php
PHP -> SQLSRV -> SQLSERVER
在Windows上运行PHP时,该扩展允许您访问Microsoft SQL Server和SQL Azure数据库。版本3.0的驱动程序支持SQL Server(从SQL Server 2005开始,包括SQL Server 2012,SQL Server 2012 LocalDB)。
有关LocalDB的更多信息,参考「PHP Driver for SQL Server Support for LocalDB and » SQL Server 2012 Express LocalDB」
由Microsoft支持SQLSRV扩展,可在此处下载:http://msdn.microsoft.com/en-us/sqlserver/ff657782.aspx
可以在此处下载SQL Server 2012 LocalDB:http://go.microsoft.com/fwlink/?LinkID=237665
!!!上面都是PHP官网的话!!!
但你去看Microsoft的手册,你会发现它的SQLSRV也支持Linux和macOS的,因为它有个「GitHub/msphpsql」项目,同时包含了SQLSRV和PDO_SQLSRV驱动。
# PDO_SQLSRV – Microsoft SQL Server Functions
PDO_SQLSRV: http://php.net/manual/en/ref.pdo-sqlsrv.php
PHP -> PDO -> PDO_SQLSRV -> SQLSERVER
它是一个实现「PHP数据对象(PDO)」接口的驱动程序,用于创建从PHP到MS SQL Server(从SQL Server 2005开始)和SQL Azure数据库的访问。
同时支持Windows和Linux平台,在上面的「SQL[……]

READ MORE

「php-mysql-cert」

内容:PHP中使用证书连接MySQL。
关于《MySQL安全连接以及使用证书访问》的配置这里不再介绍。
处于安全原因,或者其他的原因,访问数据库除了提供密码之外,还要求提供证书;
PHP 访问 MySQL 有三套API:

1). mysql original,允许PHP应用与MySQL数据库交互的早期扩展;PHP 7+ 都已经移除了;

2). mysqli,有时称之为MySQL增强扩展,可以用于使用 MySQL4.1.3或更新版本中新的高级特性;

mysqli中有两套API:一套面向对象的,另一套是面向过程的,在使用上是一样的;

3). pdo,PHP访问数据库定义了一个轻量级的一致接口。

pdo 并不完全属于访问 MySQL 的一套API。简单的说pdo是定义了一套可以访问任何数据库的API,切换数据库的时候不用改动过多的代码;

《关于 pdo、mysqli、mysql、mysqlnd、mysql client library 之间的关系》,点击查看;
mysqli
http://php.net/manual/zh/mysqli.ssl-set.php
(PHP 5, PHP 7)
当前到我的代码中使用的是 MySQLi API,所以主要记录 MySQLi 下使用证书。 mysqli_ssl_set 函数,来设置SSL链接;
mysqli::ssl_set
mysqli_ssl_set
(PHP 5, PHP 7) mysqli::ssl_set — mysqli_ssl_set — Used for establishing secure connections using SSL
说明 ¶
面向对象风格
bool mysqli::ssl_set ( string $key , string $cert , string $ca , string $capath , string $cipher ) 过程化风格
bool mysqli_ssl_set ( mysqli $link , string $key , string $cert , string $ca , string $capath , string $cipher ) Used for establishing secure connections using SSL. It must be called before mysqli_real_connect(). This function does nothing unless OpenSS[……]

READ MORE

「PHP」- 输出控制

内容:介绍“输出控制”函数库;参考官方文档,附加一些辅助说明和解释;
介绍
http://php.net/manual/en/intro.outcontrol.php
当PHP脚本有输出时,输出“控制函数”可以用这些来控制输出。 这在多种不同情况中非常有用,尤其是用来在脚本开始输出 数据后,发送http头信息到浏览器。 比如说:我已经echo了一些东西,结果由于异常要返回404之类的,那应该取消之前的echo,这是就可以使用 输出控制函数库;
**: 输出控制函数不影响由 header() 或 setcookie()发送的文件头信息,仅影响 echo这样的函数和PHP代码块间的数据。
该函数库属于 PHP核心函数库,不需要安装扩展:)
运行环境配置
http://php.net/manual/en/outcontrol.configuration.php
output_buffering = boolean/integer
默认值为 0 或者 Off 一个意思。On表示在所有的脚本中使用控制输出。 PHP-CLI 中默认为Off,因为在PHP-CLI不需要进行输出控制,准确说是没什么意义; 如果参数为一个整数,表示 buffer 的最大大小,单位为字节。超过的数据会舍弃,但也不正好是你设置的值,官方文档里用了一个单词“roughly”; 生产环境中的 php.ini 中,output_buffer = 4096,官方给的说法是出行性能原因;
output_handler = string
PHP 4.0.4+ 默认为空; 该选项可将脚本所有的输出,重定向到一个函数。 例如,将 output_handler 设置为 mb_output_handler() 时,字符的编码将被修改为指定的编码。设置的任何处理函数,将自动的启用 output buffering。

不能同时使用 mb_output_handler() 和 ob_iconv_handler(),也不能同时使用 ob_gzhandler() 和 zlib.output_compression。
只有“内置函数”可以使用此指令。对于“用户定义的函数”,使用 ob_start() 的第一个参数。

implicit_flush = boolean
默认为 FALSE;CLI SAPI 中为 TRUE; 如将该选项改为 TRUE,PHP 将使输出层,在每段信息块输出后,自动刷新。意思就是说每次使用 print()、echo() 等函数或在每个 HTML 块之后,调用 PHP 中的 flush() 函数。
在Web环境中使用这个函数,对性能有很大的影响,只建议在 debug 的时候使用[……]

READ MORE

「continue」

内容:continue,对就是你知道的那个continue。
更新日期:2020年09月11日 @IGNORECHANGE

“Note: In PHP the switch statement is considered a looping structure for the purposes of continue. continue behaves like break (when no arguments are passed). If a switch is inside a loop, continue 2 will continue with the next iteration of the outer loop.”

意思是:在PHP中,switch 语句被认为是可以使用 continue 的一种循环结构。如果continue没有参数,那它和break一样。如果switch在循环中,continue 2将继续外层循环的下一轮。
continue 后面可以跟一个可选的数字。数字的含义标识要跳过几层循环。默认为 1。Demo:

<?php

$i = 0;
while ($i++ < 5) {
echo “Outer<br />\n”;
while (1) {
echo “Middle<br />\n”;
while (1) {
echo “Inner<br />\n”;
continue 3;
}
echo “This never gets output.<br />\n”;
}
echo “Neither does this.<br />\n”;
}
// 下面是输出:
// Outer<br />
// Middle<br />
// Inner<br />
// Outer<br />
// Middle<br />
// Inner<br />
// Outer<br />
// Middle<br />
// Inner<br />
// Outer<br />
// Middle<br />
// Inner<br />
// Outer<br />
// Middle<br />
// Inner<br />

continue 后面的分号(;)不能省略:

<?php
for ($i = 0; $i < 5; ++$i) {
if ($i =[……]

READ MORE

「PHP」- include[_once] / require[_once]

内容:介绍include、include_once、require、require_once;
我就想知道:能不能把某个文件夹下的类一次性全部引入。
存在的问题
容易引发的一个问题就是引入了大量无用的类。
提前搜索了一下,看了德问社区的一个类似问题:http://www.dewen.net.cn/q/9824
我的另外一篇文章《PHP 自动加载类》,介绍了如何解决这个问题。本文的内容不是介绍类加载的。
言归正传
起初我并不想写,可以搜索到很多,但是不写的话,印象不深刻,所以还是要整理一下。 下面是关于 include、include_once、require、require_once:
include
http://php.net/manual/zh/function.include.php
对引入文件的查找
被包含文件先按参数给出的路径寻找; 如果没有给出目录(参数只提供了文件名)时则按照 include_path 指定的目录寻找。 如果在 include_path 下没找到该文件,则 include 最后才在调用脚本文件所在的目录和当前工作目录下寻找。 如果最后仍未找到文件,则 include 会发出一条警告(E_WARNING),。
如果定义了路径(即参数中含有路径信息)include_path 都会被完全忽略。例如一个文件以 ../ 开头。
返回值
在失败时, include 返回 FALSE 并且发出警告。 在成功时,则返回 1。如果在被包含的文件中另外给出了返回值,则文件中的返回值为 include 的返回值。比如:

// demo.php
<?php

$value = 1234;
return $value;

?>

// test.php
<?php

$a = include ‘demo.php’;
echo $a; // 1234;

对引入文件的处理及变量、函数、类的作用域
当一个文件被包含时,其中所包含的代码继承了 include 所在行的变量范围。从该处开始,调用文件在该行处可用的任何变量在被调用的文件中也都可用。不过所有在包含文件中定义的函数和类都具有全局作用域。
如果 include 出现于一个函数里,则被调用的文件中所包含的所有代码将表现得如同它们是在该函数内部定义的一样。所以它将遵循该函数的变量范围。此规则的一个例外是魔术常量,它们是在发生包含之前就已被解析器处理的。
当一个文件被包含时,语法解析器在目标文件的开头脱离 PHP 模式并进入 HTML 模式,到文件结尾处恢复。由于此原因,目标文件中需要作为 PHP 代码执行的任何代码都必须被包括在有效的 PHP 起始和结束[……]

READ MORE

「PHP 标记种类」

内容:介绍PHP中的四种标签;
<?php ?>
<?php echo ‘if you want to serve XHTML or XML documents, do it like this’; ?>
这是最常用的,也是建议使用的格式;
<script language=”php”></script>
<script language=”php”>

echo ‘some editors (like FrontPage) don\’t like processing instructions’;
</script>

这种标签格式也是支持的。
<? echo ” ?>
<? echo ‘this is the simplest, an SGML processing instruction’; ?> <?= expression ?> This is a shortcut for “<? echo expression ?>”
仅在通过 php.ini 配置文件中的指令 short_open_tag 打开后才可用,或者在 PHP 编译时加入了 –enable-short-tags 选项。 自 PHP 5.4 起,短格式的 echo 标记(`<?=’) 总会被识别,而不管 short_open_tag 的设置是什么,直接无视。
文档中“建议关闭”对这种标签的支持,因为在生成XML文档的时候会出现问题(XML是以 `<?’ 开始的),之所以保留是为了兼容。
<% echo ”; %>
<% echo ‘You may optionally use ASP-style tags’; %> <%= $variable; # This is a shortcut for “<% echo . . .” %>
ASP 风格标记(上例 4)仅在通过 php.ini 配置文件中的指令 asp_tags 打开后才可用。[……]

READ MORE

「PHP」- 4.Packages and Build Tools

汉字转拼音
php-pinyin: https://gitee.com/mz/mzphp2
混淆加密工具
mzphp2: https://gitee.com/mz/mzphp2

章节列表
「pecl、pear、peardev命令介绍」 「PHP」- Composer 「Composer」 – 如何恢复composer.json文件 「使用phpize命令手动安装PHP扩展」 「PHP」- 扩展与类库 「Multibyte String」 「Memcached and Memcache」 「PHP」- 安装Zend Guard Loader扩展[……]

READ MORE

「Composer」 – 如何恢复composer.json文件

文件composer.json不在仓库里,仓库里只有一堆已安装的包,不知道以前的人是怎么想的。我现在要安装一个有着一堆依赖的扩展,我挨个下载???EXM???
现在的任务是恢复composer.json文件。这也是本文要讲述的内容。
#1 创建初始化composer.json文件
在vendor/的同级目录中,创建名为composer.json的空文件。
然后,执行composer init命令执行初始化,并填写信息。
#2 查看已经安装的包
执行命令composer show –installed查看已经安装的vendor/中的包。
当然上述步骤不是必需的。只是说能看见已经安装的包,以及这些包的版本。离成功已经很近了。
执行如下命令,将输出内容复制到composer.json的require中:

#!/bin/sh

composer show –installed 2>/dev/null | awk ‘{printf “\”%s\” : \”%s\”,\n”, $1, $2}’

上述命令生成了json格式的包列表。
参考文献
How recover composer.json by existing project on symfony2? How can I recreate composer.json from the content of the vendor directory?[……]

READ MORE

「PHP」- 扩展与类库

内容简介
本文主要介绍在PHP中「扩展」与「类库」的区别,还包含安装、使用、管理方法等等。
两种扩展
在PHP中,通常“扩展”两种类型:

扩展:共享库 – 加载到PHP Core中的共享对象,通常需要编译安装。
类库:源码库 – 由PHP语言开发的应用扩展,是一个用程序的类库。

这两者的使用与管理上都存在着区别。
相关词汇
PEAR :: PHP Extension and Application Repository PEAR,PHP扩展与应用仓库。PEAR是可重用PHP组件的框架和分发系统。这里面包含了很多的PHP应用程序,源码为PHP源码。旨在提供一个结构化的代码库、维护分发代码、管理代码包的系统,并提升标准编码风格。
PEAR package 包含PHP源码的归档(Archive)文件。一个PEAR以.tgz的格式的Archive文件进行分发。每个Archive文件都包含了PHP源码。
PEAR package manager 用于安装、卸载、升级PEAR包和PECL扩展。
PEAR2 Pyrus 为了PHP 5.3+,Pyrus重新设计和改进PEAR的产物。但是由于Composer太火了,Pyrus已经停止开发了。
Composer Composer,PHP中的依赖管理工具,。 Composer还支持安装PEAR包。PHP社区的一些人主张用Composer替代PEAR。
安装底层扩展(C/C++等开发)
使用PECL安装,PECL :: The PHP Extension Community Library PECL是一个PHP扩展仓库,提供了所有已知的扩展。同时,PHP还提供了pecl命令,用于开发和下载PHP扩展。 PECL提供的扩展为底层扩展,扩展是多是由C/C++开发编译成.so共享对象文件,这一点不同于PEAR。
使用phpize命令安装扩展 此种安装方法实际上属于手动安装扩展。 需要在percl.php.net上手动下载扩展,然后进入源码包执行phpize、configure、make等命令。
从Linux发行版的源中安装 如果你的PHP是从发行版的源中安装的,推荐使用这种方法。常用PHP扩展模块在发行版的源中都有提供。
安装PHP应用扩展(PHP源码)
使用Composer
使用PEAR
参考文献
24 Cool PHP Libraries You Should Know About PECL Homepage PEAR Homepage Wikipedia / PEAR[……]

READ MORE

「pecl、pear、peardev命令介绍」

这篇文章介绍的内容涉及了pecl、pear、peardev命令。因为这三个命令的man手册是相同的,所以将他们放在了同一篇文章中进行介绍。
pecl,主机命令工具,用于下载和开发PECL扩展。
pear,用于安装PEAR扩展。
peardev,是pear命令的包装,移除了正常配置的内存限制。
这篇文章介绍的PEAR的版本为version1.10.1
命令行语法格式
pear [ options ] command [command-options] <parameters>
pecl [ options ] command [command-options] <parameters>
peardev [ options ] command [command-options] <parameters>
相关的配置文件
/etc/pear.conf 系统级别的全局配置文件。
$HOME/.pearrc 用户个人的配置文件。
命令支持的选项及含义(命令中的options的取值)
-v increase verbosity level (default 1)
-q be quiet, decrease verbosity level
-c file find user configuration in file
-C file find system configuration in file
-d foo=bar set user config variable foo to bar
-D foo=bar set system config variable foo to bar
-G start in graphical (Gtk) mode
-S store system configuration
-s store user configuration
-y foo unset foo in the user configuration
-V / -h, -? 显示版本和帮助信息。
帮助命令
pear help options 查看所有的选项
pear help shortcuts 查看所有command的简写。
pear help command 用于查看某个command的帮助信息。
支持的command列表(命令中的command部分及每个command支持的command-options)
build
Build an Extension From C Source
bundle
Unpac[……]

READ MORE

「PHP」- 安装Zend Guard Loader扩展

内容简介
编码与混淆的解决方案,Zend Guard,而Zend Guard Loader是一个免费的运行时应用程序,它使PHP能够运行Zend Guard编码的脚本。任何想要运行被编码的应用程序的人都可以自由使用Zend Guard Loader扩展。
本文将介绍如何安装Zend Guard Loader扩展,详细内容可以参考包中的README.md文件,该文件包含了详细的安装方法。
系统环境

操作系统:
CentOS Linux release 7.6.1810 (Core)

软件版本:
PHP 5.6.40

# 下载
访问「Zend Guard Loader Downloads」下载。按照自己的平台下载即可。
官方提供的是二进制文件,不是源码包,所以直接配置即可,不需要编译。
# 安装

#!/bin/sh

tar -xzf zend-loader-php5.6-linux-x86_64.tar.gz
cd zend-loader-php5.6-linux-x86_64

cp opcache.so /usr/lib64/php/modules/opcache_zend_loader.so
echo ‘extension=opcache_zend_loader.so’ > /etc/php.d/99-opcache_zend_loader.ini

cp ZendGuardLoader.so /usr/lib64/php/modules/
echo “zend_extension=ZendGuardLoader.so” > /etc/php.d/99-ZendGuardLoader.ini

# 验证

#!/bin/sh

php5.6-sp -i | grep “Zend Guard Loader”

参考文献
How to Install Zend Guard Loader[……]

READ MORE

「Memcached and Memcache」

在PHP中,有一个PECL扩展Memcache,这个扩展提供了一套方便的程序和面向对象的API(一共就18个方法,如果没数错),用于访问Memcached服务。
同时,PHP里面还有一个扩展Memcached,这是也是一个PHP的扩展,但是这个扩展使用了libMemcached库,比扩展Memcache的功能更多、API更丰富(大约有50个方法)。
这两套API之间并没有什么互相兼容性,有些函数只在Memcache中由,还有一些只在Memcached中有。
安装Memcached扩展
参考文献
php.net / memcache:http://php.net/manual/en/book.memcache.php php.net / memcached:http://php.net/manual/en/book.memcached.php[……]

READ MORE

「Multibyte String」

参考文献
Homepage: http://php.net/manual/en/book.mbstring.php[……]

READ MORE

「使用phpize命令手动安装PHP扩展」

phpize,实际上只是一个脚本,用于准备PHP扩展的编译环境。
phpize [options]
命令行选项及含义
–clean 移除所有创建的文件。
–help Prints usage information
–version / -v Prints API version information
使用phpize安装扩展
系统环境:CentOS release 6.5 (Final) PHP版本:PHP 5.6.15 PHP安装路径:/usr/local/php 示例扩展:这里以XHProf为例子
到pecl.php.net下载扩展 搜索,下载XHProf:http://pecl.php.net/get/xhprof-0.9.4.tgz
加压、进入源码目录、执行phpize命令,进行初始化

#!/bin/sh

tar -xf xhprof-0.9.4.tgz
cd xhprof-0.9.4

# 关键使找到config.m4文件所在的目录
cd ./extension

/usr/local/php/bin/phpize

# 因为PHP安装的/usr/local/php中,不符合FHS的标准,所以需要指出php-config的位置
./configure \
–with-php-config=/usr/local/php/bin/php-config

make && make install

# make install会输出扩展最终的安装位置。

接下来就是修改php.ini文件,启动XHProf扩展。
Error List
#1 configure: error: Cannot find php-config. Please use –with-php-config=PATH
原因:configure的时候需要用到php-config命令,而php-config命令不在环境变量中。 解决:指定php-config文件的路径,如下所示

#!/bin/sh

./configure \
–with-php-config=/usr/local/php/bin/php-config[……]

READ MORE

「PHP」- 如何找到提供某个扩展的包?

dom.so 需要安装 php-xml 扩展
参考文献
wordpress – How do I enable the DOM extension in the php.ini – Stack Overflow[……]

READ MORE