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月)的事项。

广告
将在 10 秒后关闭
bannerAds