存档

‘php技术’ 分类的存档

24

在一个段落里面,如何做到只替换存在的第一个字段
我的思路:
1,找到这篇文章是否有我想要替换的内容
2,如果有就调用这个函数 _replace_first
3,找到之后把这里替换成我要的修改的东西

举例:
$string = “精选SEO,提供专业的网站优化服务,网站内容的布局,框架的合理搭建。更多网站优化技术的完善。展示我个人网站优化的实战经验,php编程技术的完善,js技术的个人拓展,精选SEO,网站优化,网络营销。”

在这里我把第一次出现”SEO”和第一次出现”优化”的地方都加一个链接
php代码在下面实现:
要替换的词 $keyword
$keyword = array(
[0] => “SEO”
[1] => “优化”
)

调用 _replace_first函数去替换:
foreach ($keyword as $key=>$value){
一个函数里面:$string = $this->_replace_first($value,’‘.$value.’‘,$string);
}
private function _replace_first($seach,$replace,$string) {
$array = explode($seach,$string);
if(isset ($array[1])) {
$array[0] = $array[0].$replace;
$array[0] = $array[0].$array[1];
unset $array[1];
}
return implode($replace,$array);
}

09

具体操作办法(仅适用于 apache网络服务器):
文件位置:apache->conf->httpd.conf
请在 httpd.conf中使用 Alias指令:
Alias /newurl /www/htdocs/oldurl
如:用户访问新的地址 example.com/newurl/id34.html 服务器将提供的内容原地址是
example.com/www/htdocs/oldurl/id34.html。

注意:Alias只会改变本地 URL,如 www.jxuan.com/archives/153 的/archives/153部分,
而无法改变 URL的主机名称部分(如:http://www.jxuan.com/部分)。若要更改 URL的主
机名称部分,请使用Redirect或 RewriteRule指令。
菜鸟指南:本功能的Alias指令在 httpd.conf中是这一句: #Alias /webpath /full/filesystem/path
去掉前面的,并做下相应的修改即可。
SEO过程中一般在这些情况下需要用到该功能:
1、当文件移动或文件目录名称发现改变,出于SEO需要,你需要保持旧的 URL;
2、网站改版了,网站导航和链接发生变化,为了继续持有原链接带来的流量,你需要保持旧的 URL;
3、你希望不同的人用不同 URL来链接同一个的内容。(SEO一般不建议这样做)
等等。。

09

Memcache基础环境
其实基于PHP扩展的Memcache客户端实际上早已经实现,而且非常稳定。先解释一些名词,Memcache是danga.com的一个开源项目,可以类比于MySQL这样的服务,而PHP扩展的Memcache实际上是连接Memcache的方式。

首先,进行Memcache被安装具体可查看:
Linux下的Memcache安装:http://www.ccvita.com/257.html
Windows下的Memcache安装:http://www.ccvita.com/258.html;
其次,进行PHP扩展的安装,官方地址是http://pecl.php.net/package/memcache
最后,启动Memcache服务,比如这样
/usr/local/bin/memcached -d -p 11213 -u root -m 10 -c 1024 -t 8 -P /tmp/memcached.pid
/usr/local/bin/memcached -d -p 11214 -u root -m 10 -c 1024 -t 8 -P /tmp/memcached.pid
/usr/local/bin/memcached -d -p 11215 -u root -m 10 -c 1024 -t 8 -P /tmp/memcached.pid

启动三个只使用10M内存以方便测试。
分布式部署
PHP的PECL扩展中的memcache实际上在2.0.0的版本中就已经实现多服务器支持,现在都已经2.2.5了。请看如下代码
$memcache = new Memcache;
$memcache->addServer(‘localhost’, 11213);
$memcache->addServer(‘localhost’, 11214);
$memcache->addServer(‘localhost’, 11215);
$memStats = $memcache->getExtendedStats();
print_r($memStats);

通过上例就已经实现Memcache的分布式部署,是不是非常简单。

分布式系统的良性运行
在Memcache的实际使用中,遇到的最严重的问题,就是在增减服务器的时候,会导致大范围的缓存丢失,从而可能会引导数据库的性能瓶颈,为了避免出现这种情况,请先看Consistent hashing算法,中文的介绍可以参考这里,通过存取时选定服务器算法的改变,来实现。
修改PHP的Memcache扩展memcache.c的源代码中的
“memcache.hash_strategy” = standard为
“memcache.hash_strategy” = consistent
重新编译,这时候就是使用Consistent hashing算法来寻找服务器存取数据了。
有效测试数据表明,使用Consistent hashing可以极大的改善增删Memcache时缓存大范围丢失的情况。
NonConsistentHash: 92% of lookups changed after adding a target to the existing 10
NonConsistentHash: 90% of lookups changed after removing 1 of 10 targets
ConsistentHash: 6% of lookups changed after adding a target to the existing 10
ConsistentHash: 9% of lookups changed after removing 1 of 10 targets

十一
26

过滤HTML代码的函数

function htmlEncode($string) {
    $string=trim($string);
    $string=str_replace("&","&",$string);
    $string=str_replace("'","'",$string);
    $string=str_replace("&","&",$string);
    $string=str_replace(""",""",$string);
    $string=str_replace(""",""",$string);
    $string=str_replace("<","<",$string);
    $string=str_replace("<","<",$string);     $string=str_replace(">",">",$string);
    $string=str_replace(">",">",$string);
    $string=str_replace(" "," ",$string);
    $string=nl2br($string);
    return $string;
}

php中使用函数类过滤

function uh($str) { $farr = array( "/\s+/",                         //过滤多余的空白 "/<(\/?)(scrīpt|i?frame|style|html|body|title|link|meta|\?|\%)([^>]*?)>/isU", //过滤 <scrīpt 等可能引入恶意内容或恶意改变显示布局的代码,如果不需要插入flash等,还可以加入<object的过滤 "/(<[^>]*)on[a-zA-Z]+\s*=([^>]*>)/isU", //过滤javascrīpt的on事件 ); $tarr = array( " ", "<\\1\\2\\3>",           //如果要直接清除不安全的标签,这里可以留空 "\\1\\2", ); $str = preg_replace( $farr,$tarr,$str); return $str; }

十一
26

配置错误信息回报的等级。

语法: int error_reporting(int [level]);

返回值: 整数

函数种类: PHP 系统功能

内容说明

本函数用来配置错误信息回报的等级,参数 level 是一个整数的位遮罩 (bitmask),见下表。

遮罩值    表示名称

1    E_ERROR
2    E_WARNING
4    E_PARSE
8    E_NOTICE
16    E_CORE_ERROR
32    E_CORE_WARNING

* E_NOTICE 表示一般情形不记录,只有程序有错误情形时才用到,例如企图存取一个不存在的变量,或是呼叫 stat() 函数检视不存在的文件。
* E_WARNING 通常都会显示出来,但不会中断程序的执行。这对除错很有效。例如:用有问题的正则表达式呼叫 ereg()。
* E_ERROR 通常会显示出来,亦会中断程序执行。意即用这个遮罩无法追查到内存配置或其它的错误。
* E_PARSE 从语法中解析错误。
* E_CORE_ERROR 类似 E_ERROR,但不包括 PHP 核心造成的错误。
* E_CORE_WARNING 类似 E_WARNING,但不包括 PHP 核心错误警告。

十一
26

1. 串行化的基础认识:   是指将一个变量(包括对象)转换成字节流的过程。串行化有效的解决了对象的保存和传输的问题.例如,如果在用session并使用了 session_register() 来注册对象,这些对象会在每个 PHP 页面结束时被自动序列化,并在接下来的每个页面中自动解序列化,这样在每个PHP页面中都可以使用这些对象。PHP为我们提供了两个函数,用来进行串行化和反串行化的操作,这两个函数分别是:serialize()和unserialize()。serialize()可以处理除资源指针之外的所有类型,该函数返回一个可以被存储在任何地点的字节流表达式的字符串。

<?php
//整型
$var = 23;
echo serialize($var).”\n”;    //i:23;

//浮点型
$var = 1.23;
echo serialize($var).”\n”;    //d:1.229999999999999982236431605997495353221893310546875;

//字符串
$var = “This is a string”;
echo serialize($var).”\n”;    //s:16:”This is a string”;

//布尔型
$var = true;
echo serialize($var).”\n”;    //b:1;

//数组变量
$var = array(“abc”, “def”, “xyz”, “123″);
echo serialize($var).”\n”;    //a:4:{i:0;s:3:”abc”;i:1;s:3:”def”;i:2;s:3:”xyz”;i:3;s:3:”123″;}

$var = array(“index1″=>”abc”, “index2″=>”def”, “index3″=>”xyz”, “index4″=>”123″);
echo serialize($var).”\n”;    //a:4:{s:6:”index1″;s:3:”abc”;s:6:”index2″;s:3:”def”;s:6:”index3″;s:3:”xyz”;s:6:”index4″;s:3:”123″;}

//对象序列化
class A
{
public $a = “a string”;
public $b = 123;
public $c = 123.12;
}
$obj = new A;
$str = serialize($obj);
echo $str.”\n”;              //O:1:”A”:3:{s:1:”a”;s:8:”a string”;s:1:”b”;i:123;s:1:”c”;d:123.1200000000000045474735088646411895751953125;}
$obj2 = unserialize($str);   //进行反序列化
var_dump($obj2 == $obj);     //bool(true)
?>

2. 在用 unserialize()时需要注意的一个问题: 在一个PHP页面中要 unserialize() 一个对象,需要该页面包含该对象的类的定义。也就是,如果序列化了 page1.php 中类 A 的对象 $a, 要在 page2.php 中将其反序列化重建类 A 的对象 $a,则 page2.php 中必须要出现类 A 的定义。这可以这样实现,将类 A 的定义放在一个包含文件中,并在 page1.php 和 page2.php 都包含此文件。 所以强烈建议在所有的页面中都包括这些注册的对象的类的定义,即使并不是在所有的页面中都用到了这些类。如果没有这样做,一个对象被反序列化了但却没有其类的定义,它将失去与之关联的类并成为 stdClass 的一个对象而完全没有任何可用的函数。(stdClass是一个空类,里面没有属性也没有方法

var_dump(get_class_methods(stdClass));var_dump(get_class_vars(stdClass));)

//classa.inc:
class A
{
var $one = 1;

function show_one()
{
echo $this->one;
}
}

//page1.php:
include(“classa.inc”);

$a = new A;
$s = serialize($a);
$fp = fopen(“store”, “w”); // 将 $s 存放在某处使 page2.php 能够找到
fputs($fp, $s);
fclose($fp);

//page2.php:
include(“classa.inc”);      // 为了正常解序列化需要这一行

$s = implode(“”, @file(“store”));
$a = unserialize($s);

$a->show_one(); // 现在可以用 $a 对象的 show_one() 函数了

?>

如果以上的例子中 $a 通过运行 session_register(“a”) 成为了会话的一部分,$a会在该PHP 页面结束时被自动序列化,在其他PHP页面中会自动反序列化从而可以使用该对象,那么应该在所有的页面中包含 classa.inc 文件,而不只是 page1.php 和 page2.php。

3.__sleep() __wakeup()

serialize() 检查类中是否有 __sleep() ,如果有,则该函数将在任何序列化之前运行。该函数必须返回一个需要进行序列化保存的成员属性数组,并且只序列化该函数返回的这些成员属性. 该函数有两个作用: 第一. 在序列化之前,关闭对象可能具有的任何数据库连接等. 第二. 指定对象中需要被序列化的成员属性,如果某个属性比较大而不需要储存下来,可以不把它写进__sleep要返回的数组中,这样该属性就不会被序列化

相反地,unserialize() 从字节流中创建了一个对象之后,马上检查是否具有__wakeup 的函数的存在。如果存在,__wakeup 立刻被调用。使用 __wakeup 的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。

<?php
class User
{
public $name;
public $id;

function __construct()
{
$this->id = uniqid();          //give user a unique ID 赋予一个不同的ID
}

function __sleep()
{
return(array(“name”));        //do not serialize this->id 不串行化id
}

function __wakeup()
{
$this->id = uniqid();         //give user a unique ID
}
}

$u = new User;
$u->name = “HAHA”;

$s = serialize($u);                   //serialize it 串行化 注意不串行化id属性,id的值被抛弃

$u2 = unserialize($s);                //unserialize it 反串行化 id被重新赋值
//$u and $u2 have different IDs $u和$u2有不同的ID
var_dump($u);
var_dump($u2);
?>

———- PHP debug ———-
object(User)#1 (2) {
["name"]=>
string(4) “HAHA”
["id"]=>
string(13) “47fa045529f69″
}
object(User)#2 (2) {
["name"]=>
string(4) “HAHA”
["id"]=>
string(13) “47fa04552a49a”

}
输出完成 (耗时: 0 秒) – 正常终止

十一
23

首先分析下 mkdir里面存在的参数
bool mkdir ( string $pathname [, int $mode [, bool $recursive [, resource $context ]]] )
path 必需。规定要创建的目录的名称。
mode 必需。规定权限。默认是 0777。
recursive 必需。规定是否设置递归模式。
context 必需。规定文件句柄的环境。Context 是可修改流的行为的一套选项。
mkdir() 尝试新建一个由 path 指定的目录。
默认的 mode 是 0777,意味着最大可能的访问权。

接下来是实例。是最近写的东西。通过mkdir创建文件。这里我给的权限是0755

   $root   = MD_ROOT.'/../Html/'.$path;
   $result = mkdir($root, 0755);

十一
23
mkdir($prefix= 'article');
  $fileName = time().'_'.$fileId.$postfix;
  $file=fopen($path.$fileName,'w+');
  fwrite($file,$info);
  fclose($file);
  ob_end_flush();
 }
}
?>
start();
?>


最近天气好冷。
希望明天是个好天气,有个好心情。
>

end();
?>

十一
23

网上总结出三种方法。
删除的文件的时候要考虑文件中是否存在数据。
1、递规法:利用递归一层一层的删

deleteDir($dir)
{
if (rmdir($dir)==false && is_dir($dir)) {
 if ($dp = opendir($dir)) {
  while (($file=readdir($dp)) != false) {
   if (is_dir($file) && $file!='.' && $file!='..') {
    deleteDir($file);
   } else {
    unlink($file);
   }
  }
  closedir($dp);
 } else {
  exit('Not permission');
 }
}
}
 

2、系统调用法

function del_dir($dir)
{
if(strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
    $str = "rmdir /s/q " . $dir;
} else {
    $str = "rm -Rf " . $dir;
}
}

3、循环法

function deltree($pathdir)
{
echo $pathdir;//调试时用的
if(is_empty_dir($pathdir))//如果是空的
   {
   rmdir($pathdir);//直接删除
   }
   else
   {//否则读这个目录,除了.和..外
       $d=dir($pathdir);
       while($a=$d->read())
       {
       if(is_file($pathdir.'/'.$a) && ($a!='.') && ($a!='..')){unlink($pathdir.'/'.$a);}
       //如果是文件就直接删除
       if(is_dir($pathdir.'/'.$a) && ($a!='.') && ($a!='..'))
       {//如果是目录
           if(!is_empty_dir($pathdir.'/'.$a))//是否为空
           {//如果不是,调用自身,不过是原来的路径+他下级的目录名
           deltree($pathdir.'/'.$a);
           }
           if(is_empty_dir($pathdir.'/'.$a))
           {//如果是空就直接删除
           rmdir($pathdir.'/'.$a);
           }
       }
       }
       $d->close();
   echo "必须先删除目录下的所有文件";//我调试时用的
   }
}
function is_empty_dir($pathdir)
{
//判断目录是否为空
$d=opendir($pathdir);
$i=0;
   while($a=readdir($d))
   {
   $i++;
   }
closedir($d);
if($i>2){return false;}
else return true;
}

十一
19

和上面一篇文章php使用file_get_contents抓取页面文章类似。
这里通过抓取网站图片,存入本地文件。
操作如下:
例如这里想要得到的图片链接地址是 http://www.97md.net/wp-content/themes/thatsimple/banner/2009-03-18.jpg

$url = 'http://www.97md.net/wp-content/themes/thatsimple/banner/2009-03-18.jpg';
$msg = file_get_contents($url);
$header = fopen(dirname(__FILE__).'/test.jpg','w+');
fwrite($header,$msg);
fclose($header);
echo '';

通过这里就可以得到想要的图片啦。
如果你想得到整个网站的图片,那只要遍历所有的图片地址
在逐个替换就行了。