在php编程中,ini_set函数是设置选项中的值,在执行函数后生效,脚本结束时,这个设置也失效。
不是所有的选项都能被改函数设置的。
可以设置php.ini中的选项值比如,display_error选项关闭了,但是要显示程序中的错误信息,方便调试程序,可以使用PHP ini_set函数:
ini_set(”display_errors”, “On”);
在这个页面的程序都会显示错误信息了,而且,还可以使用error_reporting来设置显示的错误信息级别。
如果需要增加脚本执行时间,那么可以设置:
ini_set(”max_execution_time”, “180″);
脚本执行时间就由默认的30秒变为180秒,当然,也可以使用set_time_limit()来设置。
其实,把PHP ini_set函数和ini_get结合使的话,非常好。
比如,想在配置文件中,添加自己的包含文件路径,但是却没有权限更改php.ini,可以结合两个函数:
/ ini_set更改php.ini配置功能
利用ini_set可以快速的修改php.ini配置设置哦,无需打开php.ini即可。
例子:
//ini_set具有更改php.ini设置的功能。
//此函数接收两个参数:需要调整的配置变量名,以及变量的新值。
//例如,在某脚本出现时增加最大执行时间(maximum execution time):
$old_max_execution_time = ini_set('max_execution_time', 120);
echo "old timeout is $old_max_execution_time <br />";
$max_execution_time = ini_get('max_execution_time');
echo "new timeout is $max_execution_time <br />";
echo 'function sets supported in this install are:<br />';
$extensions = get_loaded_extensions();
foreach ($extensions as $each_ext)
{
echo "$each_ext <br />";
echo '<ul>';
$ext_funcs = get_extension_funcs($each_ext);
foreach($ext_funcs as $func)
{
echo "<li> $func </li>";
}
echo '</ul>';
}
?>
本节主要内容:
命令行运行php脚本
查看php的版本信息:
#php -v 显示PHP的版本
有如下的php文件,hello.php:
echo "Hello from the CLI";
?>
在命令行提示符下运行此程序(调用CLI可执行文件并提供脚本的文件名):
#php phphello.php
输出Hello from the CLI
使用标准的输入和输出
在PHP脚本中使用这三个常量,以接受用户的输入,或显示处理和计算的结果。
例1,
<?php
// ask for input
fwrite(STDOUT, "Enter your name: ");
// get input
$name = trim(fgets(STDIN));
// write input back
fwrite(STDOUT, "Hello, $name!");
?>
Look what happens when you run it:
shell> php hello.php
Enter your name: Joe
Hello, Joe!
以上脚本中,fwrite()函数,首先会向标准的输出设备写一条消息,询问用户的姓名。
然后,它会把从标准输入设备获得的用户输入信息读取到一个PHP变量里,并它把合并成为一个字符串。
然后就用fwrite()把这个字符串打印输出到标准的输出设备上。
使用命令行自变量
在命令行里输入程序参数来更改其运行方式是很常见的做法。你也可以对CLI程序这样做。
PHP CLI带有两个特殊的变量,专门用来达到这个目的:
一个是$argv变量,它通过命令行把传递给PHP脚本的参数保存为单独的数组元素;
另一个是$argc变量,它用来保存$argv数组里元素的个数。
用PHP脚本编写一段读取$argv并处理它所含参数的代码是很简单的。
试试例2中的脚本,观察下其工作方式:
<?php
print_r($argv);
?>
Run this script by passing it some arbitrary values, and check the output:
shell> php phptest.php chocolate 276 "killer tie, dude!"
Array
( [0] => test.php
[1] => chocolate
[2] => 276
[3] => killer tie, dude!
)
从输出结果可以看到:
传递给test.php的值会自动地作为数组元素出现在$argv里。
注意,$argvis的第一个自变量总是脚本自己的名称。
例3,一个稍复杂些的例子:
<?php
// check for all required arguments
// first argument is always name of script!
if ($argc != 4) {
die("Usage: book.php <check-in-date> <num-nights> <room-type> ");
}
// remove first argument
array_shift($argv);
// get and use remaining arguments
$checkin = $argv[0];
$nights = $argv[1];
$type = $argv[2];
echo "You have requested a $type room for $nights nights, checking in on $checkin. Thank you for your order! ";
?>
调用示例:
You have requested a single room for 7 nights, checking in on 21/05/2005. Thank you for your order!
以上命令行脚本中,首先,检查$argc,以确保自变量的数量符合要求。
然后会从$argv里提取出每一个自变量,把它们打印输出到标准的输出设备上。
本节内容:
php对象的序列化与反序列化
将对象及其方法传递到想使用对象的页面,简单可行的方法是这样:
将对象序列化后存储起来或直接传输给需要的页面。
另外一种办法:将对象注册为 session 变量。
一,序列化对象
对象序列化,就是将对象转换成可以存储的字节流。
当需要把一个对象在网络中传输时或者要把对象写入文件或是数据库时,就需要将对象进行序列化。
序列化完整过程包括两个步骤:一个是序列化,就是把对象转化为二进制的字符串,serialize() 函数用于序列化一个对象;
另一个是反序列化,就是把对象被序列转化的二进制字符串再转化为对象,unserialize() 函数来反序列化一个被序列化的对象。
如此,整个过程下来,对象内的类型结构及数据都是完整的。
语法:
string serialize( mixed value )mixed unserialize( string str [, string callback] )
例子:
<?php
class Person {
private $name;
private $age;
function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
function say() {
echo "我的名字叫:".$this->name."<br />";
echo " 我的年龄是:".$this->age;
}}
$p1 = new Person("张三", 20);
$p1_string = serialize($p1);//将对象序列化后写入文件
$fh = fopen("p1.text", "w");
fwrite($fh, $p1_string);
fclose($fh);
?>
打开 p1.text 文件,输入内容:
O:6:"Person":2:{s:12:" Person name";s:4:"张三";s:11:" Person age";i:20;}
但通常不去直接解析上述序列化生成的字符。
二,反序列化:
<?php
class Person {
private $name;
private $age;
function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
function say() {
echo "我的名字叫:".$this->name."<br />";
echo " 我的年龄是:".$this->age;
}}
$p2 = unserialize(file_get_contents("p1.text"));
$p2 -> say();
?>
输出结果:
我的名字叫:张三我的年龄是:20
提示由于序列化对象不能序列化其方法,所以在 unserialize 时,当前文件必须包含对应的类或 require 对应的类文件。
序列化只能用于有限用户的情况下,因为需要为每个用户单独存储或写入文件,且保证文件名不能重复。
在用户不能正常退出浏览器的情况下,不能保证文件被删除。对象注册为 session 变量。
当用户数量很多时,可以考虑用 session 来保存对象。
有关session的更多信息,请参见文章:
php中session的简单例子
php session操作类(附实例)
php session函数集
php中session过期设置的方法详解
php中session的应用举例
php会话技术之Session用法举例
php注销session信息
php5中Cookie与Session用法
例子:
<?php
session_start();
class Person {
private $name;
private $age;
function __construct($name, $age) {
$this->name = $name;
$this->age = $age; }
function say() {
echo "我的名字叫:".$this->name."<br />";
echo " 我的年龄是:".$this->age;
}}
$_SESSION["p1"] = new Person("张三", 20);
?>
读取 session :
<?php
session_start();
class Person {
private $name;
private $age;
function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
function say() {
echo "我的名字叫:".$this->name."<br />";
echo " 我的年龄是:".$this->age;
}}
$_SESSION["p1"] -> say();
?>
输出结果:
我的名字叫:张三我的年龄是:20
与序列化一样,注册对象为 session 变量时并不能保存其方法。
因此,在读取 session 变量时,当前文件必须包含对应的类或者 require 对应的类文件。