当前位置:  编程技术>php
本页文章导读:
    ▪php抓取页面的几种方式        在 做一些天气预报或者RSS订阅的程序时,往往需要抓取非本地文件,一般情况下都是利用php模拟浏览器的访问,通过http请求访问url地址, 然后得到html源代码或者xml数据,得到数据.........
    ▪php设计模式之单例、多例设计模式             单例(Singleton)模式和不常见的多例(Multiton)模式控制着应用程序中类的数量。如模式名称,单例只能实例化一次,只有一个对象,多例模式可以多次实例化。      .........
    ▪在windows平台上构建自己的PHP      这是一篇翻译的文章,原文参见:https://wiki.php.net/internals/windows/stepbystepbuild顺便提一句,wiki.php.net有很多精彩的内容,想深入了解php的同学千万不要错过:)准备工作在windows平台上编译php,需要.........

[1]php抓取页面的几种方式
    来源:    发布时间: 2013-11-07


 



 

在 做一些天气预报或者RSS订阅的程序时,往往需要抓取非本地文件,一般情况下都是利用php模拟浏览器的访问,通过http请求访问url地址, 然后得到html源代码或者xml数据,得到数据我们不能直接输出,往往需要对内容进行提取,然后再进行格式化,以更加友好的方式显现出来。


下面简单说一下php抓取页面的几种方法及原理:


一、 PHP抓取页面的主要方法:


1. file()函数   


2. file_get_contents()函数 


3. fopen()->fread()->fclose()模式 


4.curl方式 


5. fsockopen()函数 socket模式 


6. 使用插件(如:http://sourceforge.net/projects/snoopy/)


二、PHP解析html或xml代码主要方式:


1. file()函数



<?php 
$url='http://t.qq.com';
$lines_array=file($url);
$lines_string=implode('',$lines_array);
echo htmlspecialchars($lines_string);


2. file_get_contents()函数

使用file_get_contents和fopen必须空间开启allow_url_fopen。方法:编辑php.ini,设置
allow_url_fopen = On,allow_url_fopen关闭时fopen和file_get_contents都不能打开远程文件。



<?php 
$url='http://t.qq.com';
$lines_string=file_get_contents($url);
echo htmlspecialchars($lines_string);


3. fopen()->fread()->fclose()模式



<?php 
$url='http://t.qq.com';
$handle=fopen($url,"rb");
$lines_string="";
do{
    $data=fread($handle,1024);
     if(strlen($data)==0) {
        break;
    }
    $lines_string.=$data;
}while(true);
fclose($handle);
echo htmlspecialchars($lines_string);


4. curl方式


使用curl必须空间开启curl。方法:windows下修改php.ini,将extension=php_curl.dll前面的分号去掉,而且需
要拷贝ssleay32.dll和libeay32.dll到C:\WINDOWS\system32下;Linux下要安装curl扩展。



<?php 
$url='http://t.qq.com';
$ch=curl_init();
$timeout=5;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$lines_string=curl_exec($ch);
curl_close($ch);
echo htmlspecialchars($lines_string);


5. fsockopen()函数 socket模式
socket模式能否正确执行,也跟服务器的设置有关系,具体可以通过phpinfo查看服务器开启了哪些通信协议,比如我的本地php socket没开启http,只能使用udp测试一下了。



<?php                                                                                                                                                
$fp = fsockopen("udp://127.0.0.1", 13, $errno, $errstr);
if (!$fp) {
    echo "ERROR: $errno - $errstr<br />\n"
} else {
    fwrite($fp, "\n")
    echo fread($fp, 26)
    fclose($fp)
}



6. 插件
网上应该有比较多的插件,snoopy插件是在网上搜到的,有兴趣的可以研究一下。

本文链接


    
[2]php设计模式之单例、多例设计模式
    来源:    发布时间: 2013-11-07

       单例(Singleton)模式和不常见的多例(Multiton)模式控制着应用程序中类的数量。如模式名称,单例只能实例化一次,只有一个对象,多例模式可以多次实例化。


       基于Singleton的特性,我们经常用Singleton配置应用程序并定义应用程序中可能随时访问的变量。但有时并不推荐使用Singleton,因为它生成了一个全局状态且


该单一根对象没有封装任何系统功能。多数情况下,会使单元测试和调试变得困难。读者根据情况自行决定。


  代码示例:



<?php
class SingletonExample{
private function __construct(){}//防止直接实例化

public static function getInstance(){ //不与任何对象有关联
static $instance=null; //调用此函数的所有代码共享该变量,不必要让其是类的静态变量
if($instance==null){
$instance=new SingletonExample();
}
return $instance;
}
}
$obj1=SingletonExample::getInstance();
$obj2=SingletonExample::getInstance();
var_dump($obj1===$obj2);// true 是同一个实例
?>


Multiton与singleton相似,不同的是后者需要getInstance()函数传递关键值。


对于给定的关键值只会存在唯一的对象实例,如果有多个节点,每个节点拥有唯一的表识符,且各个节点在某单次执行(如cms里的节点)可能出现多次,那么就可以用Multiton模式实现这些节点啊,Multiton节省内存,并确保同一个对象的多个实例不发生冲突.


示例:



 1 <?php
2 class MultitonExample{
3 private function __construct(){}//防止直接实例化
4
5 public static function getInstance($key){
6 static $instance=array();
7 if(!array_key_exists($key,$instance)){
8 $instance[$key]=new SingletonExample();
9 }
10 return $instance($key);
11 }
12
13 };
14 ?>


 



 

本文链接


    
[3]在windows平台上构建自己的PHP
    来源:    发布时间: 2013-11-07

这是一篇翻译的文章,原文参见:https://wiki.php.net/internals/windows/stepbystepbuild

顺便提一句,wiki.php.net有很多精彩的内容,想深入了解php的同学千万不要错过:)

准备工作

在windows平台上编译php,需要三样准备工作:

1,合适的编译环境,包括安装一个编译器、正确的SDK以及对应的binary tools

2,编译PHP需要用到的第三库、头文件

3,PHP源代码

构建环境

这是在windows平台上编译php最困难的部分,因为建立这样的编译环境需要大量的磁盘空间,可能会有数G

需求:

  • Microsoft Visual C++,官方的PHP版本支持VC++6.0和VC++9.0(即VC++2008),Express版本的也行。MinGW和其他的编译器是不被支持的。
  • 正确的windows SDK 或者Platform SDK,SDK需要与VC版本对应,详见https://wiki.php.net/internals/windows/windowssdk
  • 编译时用到的binary tools,详见http://windows.php.net/downloads/php-sdk/

注:

最新的php5.5可以用VC++9或者VC++11编译,不过5.5尚未正式发布。

如果使用的是VC6,则需要安装Windows Server Feb.2003 SDK,如果使用的VC9则需安装SDK6.1

构建步骤

1,安装vs2008

2,安装windows sdk 6.1

3,获得php 5.3源码,可以从此处获取snapshot (先不要解压)

4,创建文件夹c:\php-sdk

5,解压binary-tools.zip 至c:\php-sdk文件夹中。binary-tools.zip可以从此处获取(http://windows.php.net/downloads/php-sdk/)。解压后C:\php-sdk中应该包含bin,script,share等子目录。

6,打开windows sdk 6.1 shell,直接下述指令:

  PHP 5.2, 5.3 and 5.4:

setenv /x86 /xp /release

  PHP 5.5+:

setenv /x86 /2008 /release

7,

cd c:\php-sdk\

8,

bin\phpsdk_setvars.bat

9,

bin\phpsdk_buildtree.bat php53dev

10,现在解压第3步中下载的snapshot至C:\php-sdk\php53dev\vc9\x86文件夹中。解压完成之后,目录路径形如C:\php-sdk\php53dev\vc9\x86\php5.3-xyz。

11,在C:\php-sdk\php53dev\vc9\x86中,有一个deps文件夹。下载编译所依赖的一些libraries,并且解压至其中。这些libraries可以从http://wiki.php.net/internals/windows/libs获得。确保解压完成之后,deps下包含/include和/lib目录。(注:笔者直接从http://windows.php.net/downloads/php-sdk/下载了deps-5.3-vc9-x86.7z可以顺利编译通过)

12,继续在windows-sdk-shell中运行

cd C:\php-sdk\php53dev\vc9\x86\php5.3-xyz

13,

buildconf

14,查看编译选项

configure --help

15,根据自己的需要输入构建指令:

configure --disable-all --enable-cli 编译最简单的PHP内核并且只支持cli运行方式

(注: 一些扩展需要lib,头文件甚至其他程序,详见libs ,下载自己所需的版本并且解压至deps文件夹c:\php-sdk\php53\vc9\x86\deps)

16,

nmake

17,如果你需要压缩编译好的php文件,继续执行:

nmake snap

18,编译完的PHP位于C:\php-sdk\php53dev\vc9\x86\php5.3-SNAPSHOTTIME\Release_TS目录。

修改并重新编译

1,清除上次的编译结果

nmake clean

2,如果你需要重新config

buildconf --force

3,输入新的configure配置

configure --disable-all --enable-cli --enable-$remains

4,编译

nmake

 

如果只编译最精简的PHP(仅enable-cli),编译成功之后,可以观察一下编译了哪些EXT,SAPI:

除了standard(标准扩展),这个php版本只含有date,ereg,pcre,reflection,SPL几个扩展,它们的源码都可以在php-src/ext中找到。

本文链接


    
最新技术文章:
▪PHP函数microtime()时间戳的定义与用法
▪PHP单一入口之apache配置内容
▪PHP数组排序方法总结(收藏)
▪php数组排序方法大全(脚本学堂整理奉献)
▪php数组排序的几个函数(附实例)
▪php二维数组排序(实例)
▪php根据键值对二维数组排序的小例子
▪php验证码(附截图)
▪php数组长度的获取方法(三个实例)
▪php获取数组长度的方法举例
▪判断php数组维度(php数组长度)的方法
▪php获取图片的exif信息的示例代码
▪PHP 数组key长度对性能的影响实例分析
▪php函数指定默认值的方法示例
▪php提交表单到当前页面、提交表单后页面重定...
▪php四舍五入的三种实现方法
▪php获得数组长度(元素个数)的方法
▪php日期函数的简单示例代码
▪php数学函数的简单示例代码
▪php字符串函数的简单示例代码
▪php文件下载代码(多浏览器兼容、支持中文文...
▪php实现文件下载、支持中文文件名的示例代码...
▪php文件下载(防止中文文件名乱码)的示例代码
▪解决PHP文件下载时中文文件名乱码的问题
移动开发 iis7站长之家
▪php小数点后取两位的三种实现方法
▪php Redis 队列服务的简单示例
▪PHP导出excel时数字变为科学计数的解决方法
▪PHP数组根据值获取Key的简单示例
▪php数组去重的函数代码示例
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3