PHP的各种笔记
这是有关PHP7的笔记。
指定绝对路径以包含共用文件。
因为使用相对路径会很麻烦,所以选择使用绝对路径进行指定。
include('../../common.php');
这样是不行的。
include('/common.php');
使用$_SERVER[‘DOCUMENT_ROOT’]。
include('$_SERVER['DOCUMENT_ROOT'] . /common.php');
顺便提一下,在Apache、Centos7环境中,$_SERVER[‘DOCUMENT_ROOT’]会返回/var/www/html。
获取文档根路径的重点要记住的方法是在PHP中包含共享部分时的参考站点。
require、require_once、include、include_once的区别是什么?
在使用require函数指定的文件不存在时,会导致致命错误并中断处理;而在使用include函数指定的文件不存在时,会发出警告并继续处理。
以下是在加载外部文件时使用require、require_once、include、include_once的区别的参考网站:
在PHP中,include和require的使用方法和区别可以进行比较。
include()和require()之间的区别。也写了具体的使用方法区分。
经常使用的PHP命令行选项一览
– 展示帮助信息
$ php -h
Usage: php [options] [-f] <file> [--] [args...]
php [options] -r <code> [--] [args...]
php [options] [-B <begin_code>] -R <code> [-E <end_code>] [--] [args...]
php [options] [-B <begin_code>] -F <file> [-E <end_code>] [--] [args...]
php [options] -S <addr>:<port> [-t docroot] [router]
php [options] -- [args...]
php [options] -a
-a Run as interactive shell
-c <path>|<file> Look for php.ini file in this directory
在命令行上执行PHP代码。
$ php -r "echo 'hello world'.PHP_EOL;"
hello world
$
$ php -r "phpinfo();" | grep php.ini
Configuration File (php.ini) Path => /etc
读取并执行f、php文件。即使没有添加任何选项,也可以执行。
$ cat testphp.php
<?php
echo 'hello php'.PHP_EOL;
?>
$ php -f testphp.php
hello php
$ php testphp.php
hello php
获取php信息。与phpinfo()相同吧。
$ php -i | less
– 这个是用于显示配置文件相关列表的。
$ php --ini
Configuration File (php.ini) Path: /etc
Loaded Configuration File: /etc/php.ini
Scan for additional .ini files in: /etc/php.d
Additional .ini files parsed: /etc/php.d/20-bz2.ini,
/etc/php.d/20-calendar.ini,
/etc/php.d/20-ctype.ini,
– 显示编译模块的列表。
$ php -m
[PHP Modules]
bz2
calendar
Core
显示设置日期和扩展模块。
$ php --ri sqlite3
sqlite3
SQLite3 support => enabled
SQLite Library => 3.7.17
Directive => Local Value => Master Value
sqlite3.extension_dir => no value => no value
$ #存在しない拡張モジュールを指定した場合
$ php --ri sqlite
Extension 'sqlite' not present.
a、交互式外壳模式(互动外壳模式)。当您想在命令行上尝试一些 PHP 代码时非常方便。可以通过按下 Ctrl+C 来结束。
$ php -a
Interactive shell
php > echo 'aiueo';
aiueo
php > echo 3 + 3;
6
php > echo 3 * 3;
9
php > phpinfo();
phpinfo()
PHP Version => 7.4.3
通过auto_prepend_file实现初始化过程的共享化,php.ini文件。
您可以在php.ini中的auto_prepend_file选项中指定在执行主要php文件之前要执行的php文件。
实际使用的效果如下所示。
; Automatically add files before PHP document.
; http://php.net/auto-prepend-file
;auto_prepend_file =
auto_prepend_file = /home/vagrant/test/testphp.php
$ cat /home/vagrant/test/testphp.php
<?php
echo 'hello php'.PHP_EOL;
?>
$ cat /home/vagrant/test/testphp2.php
<?php
echo 'hello php2'.PHP_EOL;
?>
$ php testphp2.php
hello php
hello php2
尽管执行了testphp2.php,但testphp.php先前已被执行。
所以,我想试一试在使用PHP的Web环境中是否也适用这个设置,但是当我在Apache上执行一个随意的PHP页面时,会出现错误(HTTP ERROR 500)。 (Apache2.4)
查看Apache的错误日志(/etc/httpd/logs/error_log)会发现以下错误输出(省略了时间戳等信息)。
PHP Fatal error: Unknown: Failed opening required '/home/vagrant/test/testphp.php' (include_path='.:/usr/share/pear:/usr/share/php') in Unknown on line 0
PHP Warning: Unknown: failed to open stream: Permission denied in Unknown on line 0
在网上稍微查了一下,发现很多人在.htaccess文件中进行auto_prepend_file的设置,而不是在php.ini文件中。于是我尝试在.htaccess文件中添加以下内容并进行测试,但是仍然遇到了错误(Internal Server Error)。
php_value auto_prepend_file "/home/vagrant/test/testphp.php"
查看Apache的错误日志(/etc/httpd/logs/error_log),会输出以下错误(省略时间戳等)。
/var/www/html/.htaccess: php_value not allowed here
由于在这里(.htaccess)使用php_value是无效的,所以我尝试在httpd.conf文件的末尾添加相同的一行并重新启动Apache,但是又出现了错误(HTTP ERROR 500)。错误日志(/etc/httpd/logs/error_log)的内容如下。
PHP Fatal error: Unknown: Failed opening required '/home/vagrant/test/testphp.php' (include_path='.:/usr/share/pear:/usr/share/php') in Unknown on line 0
PHP Warning: Unknown: failed to open stream: Permission denied in Unknown on line 0
这个错误的内容与第一次尝试时的错误相同。所以错误的内容是指定的文件路径无法读取,包含路径是.:/usr/share/pear:/usr/share/php。为了解决这个问题,我在/usr/share/php/下添加了一个PHP测试文件,并相应地修改了httpd.conf中的一行。
#最後に追加
php_value auto_prepend_file "/usr/share/php/testphp.php"
当你重启了Apache之后,我能够完成我想做的事情。当执行Apache上的任意PHP页面时,首先会执行/usr/share/php/testphp.php。不仅在/usr/share/php目录下,还可以在/etc/httpd/conf目录下的PHP文件中执行。
这样一来,我们就能够创建一个类似于入口点的东西,从而能够编写所有在网络(Apache)上的php页面中共同的初始化处理等。不过,这样做可能会变得环境依赖性较高,且管理起来会比较繁琐。与其说如此,我认为到了这一步,一般都会使用网络框架之类的工具。
参考网站
– 使用auto_prepend_file和auto_append_file指令来自动加载文件
– 在apache配置文件中设置auto_prepend_file和auto_append_file的方式
– 使用auto_prepend_file来分配PHP入口点的职责
– 如何查找PHP入口点
PHP错误相关,PHP注意:PHP警告:PHP致命错误:
PHP 注意:注意
PHP 警告:警告
PHP 致命错误:错误
PHP错误、警告和注意之间有何区别?
如果发生警告或错误,如果想在浏览器上显示错误内容,需要将php.ini文件中的display_errors从Off更改为On。如果为Off,则仅会显示在日志文件/var/log/httpd/error_log中。
display_errors = On
获取主机自身(运行PHP的服务器)的全局IP地址。
这是运行PHP的服务器的全局IP地址,我以为可以用$_SERVER变量来获取,但在我的环境中却找不到。如果是私有IP,则可以通过$_SERVER[‘SERVER_ADDR’]来获取。
(但是,如果没有通过DNS分配域名,则$_SERVER[‘HTTP_HOST’]和$_SERVER[‘SERVER_NAME’]将变为全局IP。)
那么,关于如何在PHP中获取全球IP地址,我参考了下面的网站。这是使用gethostbyname()函数或curl查询自己的全球IP地址的方式。
在PHP中获取客户端和服务器的全球IP地址。
另外,根据下方的网站,似乎可以通过$_SERVER[‘HTTP_LISTEN_IPADDR’]在樱花服务器上获取全局IP。
・在樱花的租用服务器上,$_SERVER[‘SERVER_ADDR’]的值发生了变动。
・关于樱花租用服务器规格变更(2018年3月)的事项。