php判断本地或者远程文件是否存在

1、检查本地文件

file_exists()、is_file()

2、检查远程文件

fopen()、file_get_contents()、fsockopen(),注意在使用fopen需要在php.ini中添加allow_url_fopen = On配置

自己的通用函数

[php]&lt;/pre&gt;<br />
function my_file_exists($file)<br />
{<br />
if(preg_match(‘/^http:\/\//’,$file)){<br />
//远程文件<br />
if(ini_get(‘allow_url_fopen’)){<br />
if(@fopen($file,’r’)) return true;<br />
}<br />
else{<br />
$parseurl=parse_url($file);<br />
$host=$parseurl[‘host’];<br />
$path=$parseurl[‘path’];<br />
$fp=fsockopen($host,80, $errno, $errstr, 10);<br />
if(!$fp)return false;<br />
fputs($fp,&quot;GET {$path} HTTP/1.1 \r\nhost:{$host}\r\n\r\n&quot;);<br />
if(preg_match(‘/HTTP\/1.1 200/’,fgets($fp,1024))) return true;<br />
}<br />
return false;<br />
}<br />
return file_exists($file);<br />
}<br />
&lt;pre&gt;<br />
[/php]
注意,判断文件如果使用”/”代表的不是网站的根目录而是服务器的根目录

phpmyadmin配置远程连接数据库

将以下代码保存为config.inc.php放到phpmyadmin根目录下

[php]</p>
<p>$i = 0;<br />
$i++;<br />
$cfg[‘Servers’][$i][‘auth_type’] = ‘http';</p>
<p>$cfg[‘Servers’][$i][‘host’] = ‘192.168.1.221’;<br />
$cfg[‘Servers’][$i][‘connect_type’] = ‘http';<br />
$cfg[‘Servers’][$i][‘compress’] = false;</p>
<p>$cfg[‘Servers’][$i][‘extension’] = ‘mysqli';</p>
<p>$cfg[‘Servers’][$i][‘bs_garbage_threshold’] = 50;<br />
$cfg[‘Servers’][$i][‘bs_repository_threshold’] = ’32M';<br />
$cfg[‘Servers’][$i][‘bs_temp_blob_timeout’] = 600;<br />
$cfg[‘Servers’][$i][‘bs_temp_log_threshold’] = ’32M';</p>
<p>$cfg[‘UploadDir’] = ”;<br />
$cfg[‘SaveDir’] = ”;</p>
<p>[/php]

PHP获取类中具有的方法及属性

PHP获取类中具有的方法及属性
在php中要获取一个类所具有的属性和方法,可以使用php为我们提供的反射类ReflectionClass;所谓反射类就是利用这个一个类就可以得到其他类中的信息,例如:有多少个方法,方法名称分别是什么,有多少个属性,有哪些是静态的等。使用方法也很简单,值需要传入对应的类名就可以了
[php]<br />
//实例化反射类<br />
$class = new ReflectionClass(‘Teacher’);<br />
[/php]

具体的参数请参考下面的方法:
ReflectionClass::__construct — 构造一个 ReflectionClass 类
ReflectionClass::export — 导出一个类
ReflectionClass::getConstant — 获取定义过的一个常量
ReflectionClass::getConstants — 获取一组常量
ReflectionClass::getConstructor — 获取类的构造函数
ReflectionClass::getDefaultProperties — 获取默认属性
ReflectionClass::getDocComment — 获取文档注释
ReflectionClass::getEndLine — 获取最后一行的行数
ReflectionClass::getExtension — 根据已定义的类获取所在扩展的 ReflectionExtension 对象
ReflectionClass::getExtensionName — 获取定义的类所在的扩展的名称
ReflectionClass::getFileName — 获取定义类的文件名
ReflectionClass::getInterfaceNames — 获取接口(interface)名称
ReflectionClass::getInterfaces — 获取接口
ReflectionClass::getMethod — 获取一个类方法的 ReflectionMethod。
ReflectionClass::getMethods — 获取方法的数组
ReflectionClass::getModifiers — 获取修饰符
ReflectionClass::getName — 获取类名
ReflectionClass::getNamespaceName — 获取命名空间的名称
ReflectionClass::getParentClass — 获取父类
ReflectionClass::getProperties — 获取一组属性
ReflectionClass::getProperty — 获取类的一个属性的 ReflectionProperty
ReflectionClass::getShortName — 获取短名
ReflectionClass::getStartLine — 获取起始行号
ReflectionClass::getStaticProperties — 获取静态(static)属性
ReflectionClass::getStaticPropertyValue — 获取静态(static)属性的值
ReflectionClass::getTraitAliases — 返回 trait 别名的一个数组
ReflectionClass::getTraitNames — 返回这个类所使用 traits 的名称的数组
ReflectionClass::getTraits — 返回这个类所使用的 traits 数组
ReflectionClass::hasConstant — 检查常量是否已经定义
ReflectionClass::hasMethod — 检查方法是否已定义
ReflectionClass::hasProperty — 检查属性是否已定义
ReflectionClass::implementsInterface — 接口的实现
ReflectionClass::inNamespace — 检查是否位于命名空间中
ReflectionClass::isAbstract — 检查类是否是抽象类(abstract)
ReflectionClass::isCloneable — 返回了一个类是否可复制
ReflectionClass::isFinal — 检查类是否声明为 final
ReflectionClass::isInstance — 检查类的实例
ReflectionClass::isInstantiable — 检查类是否可实例化
ReflectionClass::isInterface — 检查类是否是一个接口(interface)
ReflectionClass::isInternal — 检查类是否由扩展或核心在内部定义
ReflectionClass::isIterateable — 检查是否可迭代(iterateable)
ReflectionClass::isSubclassOf — 检查是否为一个子类
ReflectionClass::isTrait — 返回了是否为一个 trait
ReflectionClass::isUserDefined — 检查是否由用户定义的
ReflectionClass::newInstance — 从指定的参数创建一个新的类实例
ReflectionClass::newInstanceArgs — 从给出的参数创建一个新的类实例。
ReflectionClass::newInstanceWithoutConstructor — 创建一个新的类实例而不调用它的构造函数
ReflectionClass::setStaticPropertyValue — 设置静态属性的值
ReflectionClass::__toString — 返回 ReflectionClass 对象字符串的表示形式。
下面的代码是获取一个类中的所有公共方法及方法所需要传入的参数:
[php]<br />
echo ‘&lt;div style=&quot;color:red;&quot;&gt;';<br />
$methods = $class-&gt;getMethods();<br />
foreach ($methods as $m){<br />
if ($m-&gt;isPublic() &amp;&amp; !$m-&gt;isConstructor()) {<br />
echo ‘具有的方法:’.$m-&gt;getName();<br />
$parameters = $m-&gt;getParameters();<br />
if($parameters){<br />
echo ‘,具有的参数:';<br />
foreach ($parameters as $p){<br />
echo $p-&gt;getName();<br />
}<br />
}<br />
echo ‘&lt;br/&gt;';<br />
}<br />
}<br />
echo ‘&lt;/div&gt;';<br />
[/php]

同一个顶级域名下的session共享方案

平时开发的小网站一般使用单个域名放到单个服务器上就可以了,那么,如果在同一个网站下使用多个子域名的时候,问题就来了,session不允许跨域,也就是说在a.test.com中设置的session到
b.test.com中不不存在了,怎么办?解决方法是让同一个主域名下的session可以共享,用以下3种方式:
1、在程序入口文件且在session_start()之前,设置:
ini_set(‘session.cookie_domain’, ‘.test.com’);
ini_set(‘session.cookie_lifetime’, ‘1800’);
2、php.ini中设置:
session.cookie_domain = .test.com;
session.cookie_lifetime = 1800;
3、在程序入口文件且在session_start()之前,设置:
session_set_cookie_params(1800 , ‘/’, ‘.test.com’);
这样在同一台服务器上多个子域名共享session的问题就解决了!

那么,如果子域名放在不同的服务上呢?这个时候我们发现session默认是以文件的形式储存到服务器上的,现在程序都分别放在两台服务器上去了,还怎么共享呢?解决办法是改变session默认的储存
方式。本文以memcache为例(当然也可以使用数据库来存储),将session信息都储存到memcache中,两个应用都到memcache中去存取session信息,同样使用3种方式:
1、php.ini中设置:
session.save_handler = memcache
session.save_path = “tcp://192.168.1.100:11211″
session.cookie_domain = ‘.test.com’
2、某个目录下的 .htaccess
php_value session.save_handler “memcache”
php_value session.save_path “tcp://192.168.1.100:11211″
php_value session.cookie_domain “.test.com”
3、在程序入口文件且在session_start()之前,设置:
ini_set(“session.save_handler”, “memcache”);
ini_set(“session.save_path”, “tcp://192.168.1.100:11211″);
ini_set(‘session.cookie_domain’, ‘.test.com’);

ini_set(“session.save_handler”, “memcached”); // 是memcached不是memcache
ini_set(“session.save_path”, “192.168.1.100:11211″); // 不要tcp

192.168.1.100代表memcache服务器ip地址,根据实际情况换成自己的ip,除了以上的方式还可以自己写一个处理类通过函数session_set_save_handler来处理session的存取问题。

windows php memcached 安装使用步骤

本文以php5.3为例:

1、下载文件包memcache(php5.3.28)

2、解压到:d:\memcached

3、在终端(也即cmd命令界面)下输入 ‘d:\memcached\memcached.exe -d install’ 安装

4、再输入: ‘d:\memcached\memcached.exe -d start’ 启动。(需要注意的: 以后memcached将作为windows的一个服务每次开机时自动启动。这样服务器端已经安装完毕了)

5、拷贝php_memcache.dll到php的ext文件夹下

6、php.ini 加入一行 ‘extension=php_memcache.dll’

7、接着在 php.ini 文件里加上:

[php][Memcache]<br />
memcache.allow_failover = 1<br />
memcache.max_failover_attempts=20<br />
memcache.chunk_size =8192<br />
memcache.default_port = 11211 [/php]

常用设置:
-p <num>          监听的端口
-l <ip_addr>      连接的IP地址, 默认是本机
-d start          启动memcached服务
-d restart        重起memcached服务
-d stop|shutdown  关闭正在运行的memcached服务
-d install        安装memcached服务
-d uninstall      卸载memcached服务
-u <username>     以<username>的身份运行 (仅在以root运行的时候有效)
-m <num>          最大内存使用,单位MB。默认64MB
-M                内存耗尽时返回错误,而不是删除项
-c <num>          最大同时连接数,默认是1024
-f <factor>       块大小增长因子,默认是1.25
-n <bytes>        最小分配空间,key+value+flags默认是48
-h                显示帮助

php扩展apc的安装和配置

一、linux
1,下载APC

wget http://pecl.php.net/get/APC-3.1.9.tgz

2,解压和编译

tar zxvf APC-3.1.9.tgz
cd APC-3.1.9
/usr/local/php/bin/phpize
./configure –enable-apc –enable-apc-mmap –enable-apc-spinlocks –disable-apc-pthreadmutex –with-php-config=/usr/local/php/bin/php-config
make
make install
make clean

3,编辑php.ini

找到 extension_dir ,把值改为/usr/local/php5/lib/php/extensions/no-debug-non-zts-20060613/,然后在下面加入

extension=apc.so
apc.enabled = 1
apc.shm_size = 64M
apc.stat = 1

其中apc.shm_size设置的是内存大小,一般用64M即可,小内存的可以改为32M。
apc.stat设置成0的话,性能会更好一点,但是设置成0后,修改了PHP文件后必须得重启下PHP才能马上更新内容。
对于平时修改比较多的站点来说,还是设置成1比较好。

4,重启PHP即可生效。

二、windows

1、下载php_apc.dll http://downloads.php.net/pierre/ 或者 http://pecl.php.net/package/APC/3.1.13/windows

2、将php_apc.dll 复制到 php 的ext目录下,修改php.ini文件 增加 extension=php_apc.dll,尾部增加

[apc]

apc.enabled = 1

apc.shm_segments = 1

apc.shm_size = 64

apc.optimization = 0

apc.num_files_hint = 1000

apc.ttl = 0

apc.gc_ttl = 3600

apc.cache_by_default = On

apc.slam_defense = 0

apc.file_update_protection = 2

apc.enable_cli = 0

apc.stat=0 #(是否启用脚本更新检查。 改变这个指令值要非常小心。 默认值 On 表示APC在每次请求脚本时都检查脚本是否被更新, 如果被更新则自动重新编译和缓存编译后的内容。但这样做对性能有不利影响。 如果设为 Off 则表示不进行检查,从而使性能得到大幅提高。)

3、重新启动apache

配置详解:http://www.php.net/manual/zh/apc.configuration.php

PHP中ts和nts版本,vc6和vc9编译版本的区别

VC6:legacy Visual Studio 6 compiler,就是使用这个编译器编译的。
VC9:Visual Studio 2008 compiler,就是用微软的VS编辑器编译的。
由于apache.org只提供VC6的版本,所以使用原版apache时只能使用VC6。(www.apachelounge.com上有apache VC9的版本提供,应该可以和PHP VC9配合,没用过)
TS:Thread Safe 线程安全, 执行时会进行线程(Thread)安全检查,以防止有新要求就启动新线程的CGI执行方式而耗尽系统资源
NTS:Non Thread Safe 非线程安全, 在执行时不进行线程(Thread)安全检查
PHP的两种执行方式:ISAPI和FastCGI。
ISAPI(Internet Server Application Programming Interface)执行方式是以DLL动态库的形式使用,可以在被用户请求后执行,在处理完一个用户请求后不会马上消失,所以需要进行线程安全检查,这样来提高程序的执行效率,所以如果是以ISAPI来执行PHP,建议选择Thread Safe版本
apache中的配置方式:

#下面这个是加载TS版本的php必须的
LoadModule php5_module “xxx/php5apache2_2.dll”
#下面这行可有可无

AddType application/x-httpd-php-source .phps
AddType application/x-httpd-php .php .php5 .php4 .php3 .phtml .phpt
FastCGI执行方式是以单一线程来执行操作,所以不需要进行线程的安全检查,除去线程安全检查的防护反而可以提高执行效率,所以,如果是以FastCGI来执行PHP,建议选择Non Thread Safe版本。
apache中的配置方式:

#下面这两行是加载NTS版本的php必须的,不可以直接写成Action application/x-httpd-php “c:/wamp/bin/php/php3.5.6/php-cgi.exe”!
ScriptAlias /php/ “C:/wamp/bin/php/php3.5.6/”
Action application/x-httpd-php “/php/php-cgi.exe”

#另外,还要有之前的AddType application/x-httpd-php .php .php5 .php4 .php3 .phtml .phpt,这样才能认识php格式的文件

#这样配置完可能还会因为权限问题而无法用php-cgi.exe解析php网页,所以还要加上下面这段

<Directory “C:/wamp/bin/php/php5.3.6/”>
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
官方并不建议你将Non Thread Safe 应用于生产环境,所以我们选择Thread Safe 版本的PHP来使用。
XAMPP在http-xampp.conf中默认配置是使用ISAPI的方式

php gzcompress() 和gzuncompress()函数实现字符串压缩

当我们说到压缩,我们可能会想到文件压缩,其实,字符串也是可以压缩的。PHP提供了 gzcompress() 和gzuncompress() 函数。

几乎有50% 压缩比率。同时,你还可以使用 gzencode() 和 gzdecode() 函数来压缩,只不用其用了不同的压缩算法。

php自动加载文件

在php开发过程中总会使用到include/require来包含文件,但是包含的文件过多的时候显得就不那么方便,那么,有什么办法能一劳永逸呢?

我们可以使用php的自动加载函数__autoload();例如:

[php]</p>
<p>function __autoload($classname)<br />
{<br />
$file = $classname . ‘.php';<br />
if (is_file($file)) {<br />
require_once($file);<br />
}<br />
}</p>
<p>[/php]

如果我们想使用自定义的函数来加载类,而不是系统的__autoload();那么我们可以使用spl_autoload_register(‘myautoload’)函数来改变,如果是在类中,可使用:

spl_autoload_register(array(‘myclass’,’myautoload’));

在此之前可以使用

set_include_path(get_include_path(). PATH_SEPARATOR . APP_PATH );需要自动加载的文件夹路径

phpcms v9+discuz+ucenter更换域名或者ip的方法

在网站开发过程中,涉及到需要修改ip或者域名时需要进行如下操作:

一、修改phpcms的配置

  1. 修改/caches/configs/database.php 
  2. 修改/caches/configs/system.php里面所有和域名有关的,把以前的老域名修改为新域名。 
  3. 进入后台设置–>站点管理,对相应的站点的域名修改为新域名。 
  4. 点击后台右上角的”更新缓存”按钮更新系统缓存。
  5. 进入内容–>附件管理–>附件地址替换。把附件地址批量的替换为新的地址。 
  6. 内容–>批量更新URL 。把所有的文章的地址都更新一下。 
  7. 内容–>管理栏目–>更新栏目缓存。将栏目的链接地址改为新地址。

二、修改phpcms中phpsso中的配置

  1. 修改/phpsso_server/caches/configs/database.php
  2. 修改/phpsso_server/caches/configs/system.php 
  3. 修改后台phpsso应用管理中的地址
  4. 修改后台phpsso->系统设置unceter设置中的相关信息

三、修改discuz中的配置

  1. 修改/config/config_global.php
  2. 修改/config/config_ucenter.php

三、修改discuz中ucenter的配置

  1. 修改/uc_server/data/config.inc.php
  2. 修改应用管理中的相关信息