网络编程/PHP
资源
PHP(代表 PHP Hypertext Preprocessor)是一种用于处理网络请求的编程语言。当您使用浏览器请求或获取网页时,您向服务器发送了一个请求。网络服务器知道如何使用 URL 找到文件并将其发送回您的浏览器。PHP 允许我们在网络服务器上创建程序,当请求程序时,服务器会将程序的输出作为响应发送。要使这能够正常工作,网络服务器必须知道如何处理 PHP 文件。大多数网络服务器都安装了 PHP 模块,当它们看到对 PHP 文件的请求时,它们会将请求转发到 PHP 模块。PHP 模块将解析请求参数并调用请求的 PHP 代码。
这是一个强大的想法。使用 PHP,您可以在网络服务器上创建程序,这些程序可以动态地使用来自文件、数据库或其他网络服务的各种数据源来创建网页。即使它是在网络客户端-服务器模型之上的一个简单的请求-响应模型,我们也可以通过将复杂的交互分解为一系列请求-响应周期来创建强大的网络应用程序。
PHP 是一种脚本语言。我们创建我们的程序作为文本文件,这些文本文件也是可执行文件。当程序执行时,PHP 解释器会读取源代码/可执行文件并一次执行一行代码。您可以在服务器上使用解释器测试您的 PHP 代码,方法如下
$php my_php_code.php
在 PHP 文件中,您可以混合 PHP 代码和静态内容。当文件执行时,只有 PHP 代码会被执行。代码的输出替换代码部分,形成程序的输出,静态内容保持不变。这种设计使使用模板生成网页并向页面部分注入动态内容变得容易。
一个 PHP 代码块 使用标签定义,如示例所示
<!DOCTYPE html>
<html>
<body>
<h1>My hello world page</h1>
<?php
echo "Hello World!";
?>
</body>
</html>
请查看 w3schools.com 上的以下教程以学习基本的 PHP 语法
<html>
<head>
<title>My TODO list</title>
</head>
<body>
<ul>
<?php
$todos = array("Buy milk", "Buy eggs", "Read a book");
$todo_count = 3;
for ($i=0; $i<$todo_count; $i++){
echo "<li>".$todos[$i]."</li>\n";
}
?>
</ul>
</body>
</html>
前面 PHP 脚本生成的 HTML 如下所示
<html>
<head>
<title>My TODO list</title>
</head>
<body>
<ul>
<li>Buy milk</li>
<li>Buy eggs</li>
<li>Read a book</li>
</ul>
</body>
</html>
缩进不是我们预期的,我们可以从 PHP 脚本中打印空格或制表符,但这将非常繁琐。相反,我们可以使用表达式块将动态内容注入到静态内容中,如以下示例所示。
<html>
<head>
<title>My TODO list</title>
</head>
<body>
<ul>
<?php
$todos = array("Buy milk", "Buy eggs", "Read a book");
$todo_count = 3;
for ($i=0; $i<$todo_count; $i++){?>
<li><?=$todos[$i]?></i>
<?php }
?>
</ul>
</body>
</html>
<html>
<head>
<title>My TODO list</title>
</head>
<body>
<ul>
<?php
$todos = file("todolist.txt");
$todo_count = count($todos);
for ($i=0; $i<$todo_count; $i++){
echo "<li>".$todos[$i]."</li>";
}
?>
</ul>
</body>
</html>
函数是可重用的代码块。PHP 有一组内置的 字符串函数 用于操作字符串。部分字符串函数列表如下
explode 函数允许我们将字符串“解包”成一个子字符串数组。以下代码
<?php
$items = explode(":", "item1:item2:item3");
print_r($items);
?>
将输出
Array
(
[0] => item1
[1] => item2
[2] => item3
)
您可以使用 list 标记命名子字符串。以下代码
<?php
list($a, $b) = explode(":", "item1:item2:item3");
print "a=".$a."\n";
print "b=".$b;
?>
将输出
a=item1
b=item2
implode 函数将字符串数组打包成一个字符串。
Python 数组 允许我们使用单个变量引用一组项目。这些项目可以是任何数据类型,包括数组(如何创建多维数组)。Python 数组的大小不是固定的。事实上,有一些函数允许您将数组视为队列或列表。以下是一些示例数组函数
- array()
- count()
- list()
- array_push()
- array_pop()
- array_slice()
- array_splice()
- array_shift()
- array_unshift()
- sort()
- rsort()
- 数组函数的完整列表
PHP 超全局变量 是一组预定义的变量,这些变量始终可供服务器上的所有 PHP 脚本访问。
它们是
- $GLOBALS
- $_SERVER
- $_REQUEST
- $_POST
- $_GET
- $_FILES
- $_ENV
- $_COOKIE
- $_SESSION
以下脚本
<?php
print_r($_SERVER);
?>
将输出类似于以下内容
Array ( [HTTP_HOST] => 198.209.99.99 [HTTP_CONNECTION] => keep-alive [HTTP_CACHE_CONTROL] => max-age=0 [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 [HTTP_USER_AGENT] => Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.122 Safari/537.36 [HTTP_ACCEPT_ENCODING] => gzip,deflate,sdch [HTTP_ACCEPT_LANGUAGE] => en-US,en; ...
如您所见,服务器通过发送的 HTTP 请求从客户端获取各种信息,并通过 $_SERVER 变量将其提供给 PHP 脚本。
如果我们使用以下 URL 请求以下脚本:http://host/path/to/test.php?first_name=Curious&last_name=George,脚本将回显通过此请求发送的参数。
<?php
print_r($_REQUEST);
?>
实际输出是
Array ( [first_name] => Curious [last_name] => George )
$_REQUEST 是一个关联数组,其索引为字符串。您可以通过其名称引用数组中的元素,例如 $_REQUEST["first_name"] 将为您提供“Curious”的值。如果您希望通过查询字符串将参数发送到您的脚本,您可以尝试通过此 $_REQUEST 变量获取它。以下脚本测试参数是否已发送,如果查询字符串中未提供参数,则回显“first_name 参数缺失”。
<?php
$first_name = $_REQUEST["first_name"];
if (isset($_REQUEST["first_name"])){
print "first_name=".$first_name;
}else{
print "first_name parameter is missing.";
}
PHP 文件函数允许我们访问和操作执行 PHP 脚本的服务器上的文件系统。基本文件函数包括从文件或目录读取内容以及写入文件。一些常用的文件函数如下
以下 PHP 脚本从文件读取一首诗并将其输出为有序列表。
<ol>
<?php
$lines = file("poem.txt");
foreach ($lines as $line){
?>
<li><?=$line?></li>
<?php
}
?>
</ol>
输出将显示在浏览器窗口中,如下所示
1. All that is gold does not glitter, 2. Not all those who wander are lost; 3. The old that is strong does not wither, 4. Deep roots are not reached by the frost. 5. From the ashes a fire shall be woken, 6. A light from the shadows shall spring; 7. Renewed shall be blade that was broken, 8. The crownless again shall be king.
读取目录类似于读取文件,只是结果是我们要读取的目录的文件和目录列表。glob 函数允许我们扫描目录以读取与模式匹配的项目(文件或目录)。以下脚本读取“word”子目录中的文本文件名称,该子目录位于包含该脚本的目录下。
<?php
$file_names = glob("words/*.txt");
print_r($file_names);
?>
如以下输出所示,glob 函数返回的数组包含文件的相对路径,这使得读取文件(下一个示例)变得容易。
Array ( [0] => words/hits.txt [1] => words/words.txt )
下一个脚本获取文件的路径,读取文件内容,并将它们回显给调用者。
<?php
$files = glob("words/*.txt");
foreach ($files as $file){
$content = file_get_contents($file);
?>
<h1><?=basename($file)?></h1>
<?=$content ?>
<?php
}
?>
脚本的示例输出如下所示。basename 函数返回路径的最后一个组件,即“裸”文件名。
<h1>hits.txt</h1> 123 <h1>words.txt</h1> prothalamion noun a song in celebration of a marriage atrabilious adjective given to or marked by melancholy; GLOOMY hyacinth noun a precious stone of the ancients sometimes held to be the sapphire; a gem zircon or essonite
PHP 包含语句将另一个文件的内容复制到包含语句出现的当前文件中。例如,以下语句将“包含”navigation.php 脚本的输出(例如导航栏的 HTML 代码)到它自己的输出中。
<?php include "navigation.php"; ?>