php中fsockopen采集网页内容实例
用法
int fsockopen(string hostname, int port, int [errno], string [errstr], int [timeout]);
一个采集网页实例
代码如下 | 复制代码 |
<?php return false; |
被禁用后的解决方法
服务器同时禁用了fsockopen pfsockopen,那么用其他函数代替,如stream_socket_client()。注意:stream_socket_client()和fsockopen()的参数不同。
fsockopen( 替换为 stream_socket_client( ,然后,将原fsockopen函数中的端口参数“80”删掉,并加到$host。
例
代码如下 | 复制代码 |
$fp = fsockopen($host, 80, $errno, $errstr, 30); |
一、LycFtpAbstract.class.php FTP基类
代码如下 | 复制代码 |
<?php /* author:凹凸曼(lyc) /* email: jar-c@163.com /* time : 2011-04-22 */ abstract class Lyc_Ftp_Abstract { protected $ftpobj=null; protected $host=''; protected $user='anonymous'; protected $pwd=''; protected $mode=FTP_BINARY; protected $port=21; protected $timeout=90; protected $pasv=TRUE; protected function init(){ } /** * 建立ftp连接 * */ protected function connect(){ $this->ftpobj=@ftp_connect($this->host,$this->port,$this->timeout); if(null==$this->ftpobj){ require_once 'Lyc/Ftp/Exception.class.php'; throw new Lyc_Ftp_Exception("FTP ERROR : Couldn't connect to $this->host"); } } /** * 建立ssl ftp连接 * */ protected function connectSsl(){ $ftpobj=@ftp_ssl_connect($this->host,$this->port,$this->timeout); if(null==$ftpobj){ require_once 'Lyc/Ftp/Exception.class.php'; throw new Lyc_Ftp_Exception("FTP ERROR : Couldn't connect to $this->host"); } } /** * 登录验证ftp 及设置模式 * */ protected function login(){ if(@ftp_login($this->ftpobj,$this->user,$this->pwd)){ ftp_pasv($this->ftpobj,$pasv); }else{ require_once 'Lyc/Ftp/Exception.class.php'; throw new Lyc_Ftp_Exception("FTP ERROR : Couldn't login to $this->host"); } } /** * 上传文件 * */ public function upload($remotefile,$localfile){ } /** * 下载文件 * */ public function download($localfile,$remotefile){ } /** * 关闭连接 * */ public function close(){ if(is_string($this->ftpobj)){ ftp_close($this->ftpobj); } } } ?> |
二、LycFtpFtp.class.php 实现类
代码如下 | 复制代码 |
<?php /* author:凹凸曼(lyc) /* email: jar-c@163.com /* time : 2011-04-22 /* */ require_once 'Lyc/Ftp/Abstract.class.php'; class Lyc_Ftp_Ftp extends Lyc_Ftp_Abstract{ public function __construct($host,$user,$pwd,$mode=FTP_BINARY,$port=21,$timeout=90,$pasv=TRUE){ $this->host=$host; $this->user=$user; $this->pwd=$pwd; $this->mode=$mode; $this->port=$port; $this->timeout=$timeout; $this->pasv=$pasv; $this->init(); } protected function init(){ $this->connect(); $this->login(); } /** * 上传文件 * */ public function upload($remotefile,$localfile){ $res=ftp_nb_put($this->ftpobj,$remotefile,$localfile,$this->mode,ftp_size($this->ftpobj,$remotefile)); while($res==FTP_MOREDATA){ $res=ftp_nb_continue($this->ftpobj); } if($res!=FTP_FINISHED){ return FALSE; } return TRUE; } /** * 下载文件 * */ public function download($localfile,$remotefile){ ftp_set_option($this->ftpobj,FTP_AUTOSEEK,FALSE); $res=ftp_nb_get($this->ftpobj,$localfile,$remotefile,$this->mode,ftp_size($this->ftpobj,$localfile)); while($res==FTP_MOREDATA){ $res=ftp_nb_continue($this->ftpobj); } if($res!=FTP_FINISHED){ return FALSE; } return TRUE; } } ?> |
三、LycException.class.php 异常基类
代码如下 | 复制代码 |
<?php /* author:凹凸曼(lyc) /* email: jar-c@163.com /* time : 2011-04-22 /* */ class Lyc_Exception extends Exception{ } ?> |
四、LycFtpException.class.php FTP异常类
代码如下 | 复制代码 |
<?php /* author:凹凸曼(lyc) /* email: jar-c@163.com /* time : 2011-04-22 */ require_once 'Lyc/Exception.class.php'; class Lyc_Ftp_Exception extends Lyc_Exception{ } ?> |
五、测试区
代码如下 | 复制代码 |
|
代码如下 | 复制代码 |
<form action=”upload.php” method=”post” enctype=”multipart/form-data”> |
选择文件后点击上传
代码如下 | 复制代码 |
<?php |
查看源文件:
代码如下 | 复制代码 |
Array ( [pictures] => Array ( [name] => Array ( [0] => file1.txt [1] => file2.txt [2] => file3.txt ) [type] => Array ( [0] => application/octet-stream [1] => application/octet-stream [2] => application/octet-stream ) [tmp_name] => Array ( [0] => D:EasyPHP\tmpphp47.tmp [1] => D:EasyPHP\tmpphp48.tmp [2] => D:EasyPHP\tmpphp49.tmp ) [error] => Array ( [0] => 0 [1] => 0 [2] => 0 ) [size] => Array ( [0] => 94289 [1] => 65536 [2] => 102400 ) ) ) |
假设名为 /file1.txt??和 /file2.txt 的文件被提交,则 $_FILES['pictures']['name'][0] 的值将是 file1.txt,而 $_FILES['pictures']['name'][1] 的值将是 file2.txt。类似的,$_FILES['file2.txt']['size'][0] 将包含文件 file1.txt 的大小,
有了上面信息了我们要实现多文件上传就简单了
代码如下 | 复制代码 |
<?php class upload { function __construct($name, $ext=array(), $rename=true) { private function initupload() { $this->chkupload(); private function chkupload() { if ($up_file['size'] / 1024 > $this->up_max) { $up_allw = false; if ($up_file['size'] / 1024 > $this->up_max) { $this->uploading(); private function uploading() { if (move_uploaded_file($up_file['tmp_name'], $file_name)) { public function getupload() { function __destruct() {} |
在上面我们会看到一个for ($i = 0; $i < $up_cnt; $i ++) ,这个是遍历我们上面讲的一个个实例了。
以前的php5.2之前的版本是不能可使用APC模块的,因为之前的压根就没有这个APC模块,如果想使用APC模块实现上传进度条我们必须是php5.2或更高版本。从5.2开始APC加入了一个叫APC_UPLOAD_PROGRESS的东东,解决了困扰大家已久的进度条问题。并且它把原来的上传时把临时文件全部缓存到内存改成了当临时文件达到设定值时就自动保存到硬盘,有效地改善了内存利用状况。
它的作用原理是在上传时候赋予每个上传一个唯一的ID,当 PHP 脚本收到一个上传文件时,解释程序将自动检查 $_POST数组中名为 APC_UPLOAD_PROGRESS 的隐藏字段,它将成为缓存变量,存储关于上传的信息,这样脚本就可以通过上传的ID来访问上传文件的状态信息。
APC是Alternative PHP Cache的简称,是 PHP 的一个免费公开的优化代码缓存。它用来提供免费,公开并且强健的架构来缓存和优化 PHP 的中间代码。
APC模块的参数配置
代码如下 | 复制代码 |
Name Default Changeable Changelog |
好了配置好了现在就开始写程序了
XML/HTML代码
代码如下 | 复制代码 |
<!–以下为上传表单–> |
最主要的就是那个APC_UPLOAD_PROGRESS的隐藏域,有了它脚本才能去访问目前上传文件的状态,另外加一个显示上传状态的div就好了。
下面是处理Ajax的脚本,我用了Jquery框架,json传递消息。
JavaScript代码
代码如下 | 复制代码 |
再 |
下来就是读取上传状态的PHP代码了,至于上传文件的处理可以按照平常自己的来写.
代码如下 | 复制代码 |
//上传文件操作函数,可按照自己的需要编写 function upflvAction() { if($_SERVER['REQUEST_METHOD']==‘POST’){ $subject = trim($this->f->filter($this->_request->getPost(‘subject’))); $content = trim($this->f->filter($this->_request->getPost(‘content’))); Zend_Loader::loadClass(‘Custom_FlvOp’); $flv = new Custom_FlvOp; $flv->uploadFlv(‘upfile’,$subject,$content); } } //这就是读取上传状态的函数了~~ function upprocessAction() { if(isset($_GET['progress_key'])) { $status = apc_fetch(‘upload_’.$_GET['progress_key']); $json = array( ‘per’=>$status['current']/$status['total']*100, ‘total’=>round($status['total']/1024), ‘current’=>round($status['current']/1024), ); require_once("Zend/Json.php"); echo Zend_Json::encode($json); } } |
一些关于apc配置详解
apc.enabled 布尔型
apc.enabled 可以被设成 0 来禁用 APC。这主要是有用的,当 APC 被静态编译入 PHP 时,因为没有其它方法来禁用它(当编译为 DSO 的时候,可以将 php.ini 中的 extension 行注释掉)。
apc.shm_segments 整型
对编译缓存分配共享内存块的数量。如果APC用光了共享内存,而且你已经设置 apc.shm_size为系统允许的最大值的情况下,你可以试着去提高这个参数的值。
apc.shm_size 整型
每个共享内存块的大小是以MB为单位的。在默认情况下,一些系统(包括大多数BSD变种系统)的共享内存块的大小限制的很低。
apc.optimization 整型
优化等级。设为0则禁用优化,越高的值使用越强有力的优化。期待有适度的速度上的改进。这个还是实验性质的。
apc.num_files_hint 整型
对在你的Web服务器上被包含和请求的不同的源文件的数量的提示。如果你无法确定,设置为0或者省略;这个设置主要可能用于有成千的源文件的站点。
apc.ttl 整型
当一个缓存条目在缓存区的位置被另一个条目需要时,我们需要考虑的是这个缓存条目在缓存区的位置被允许空闲的秒数。将这个参数设置为0意味着你的缓存可能充满不新鲜的条目,同时导致新的条目无法被缓存。
apc.gc_ttl 整型
缓存条目在垃圾收集列表中存活的秒数。这个值提供了出错保护在执行一个缓存源文件,而同时服务器进程死了的事件中。如果那个源文件被修改,内存分配给旧版本的缓存条目将不会被回收,直到这个参数设定的TTL值到的时候。设置为0就是禁止这个特性。
apc.cache_by_default 布尔型
默认为On,但可以被设置为Off并和以加号开头的apc.filters配合使用,文件仅仅在匹配过滤器时才被缓存。
apc.filters 字符串
一个以逗号分割的POSIX扩展正则表达式的列表。如果任何模式匹配源文件名,这个文件将不会被缓存。注意用来匹配的文件名是传递给 include/require 的文件名,而不是绝对路径。如果正则表达式的第一个字符是 + ,则这个表达式就意味着任何匹配表达式的文件将会被缓存,如果第一个字符是 - 则任何匹配都不会被缓存。 - 是默认值,所以可以被省略。
apc.mmap_file_mask 字符串
apc.slam_defense 整型
在非常繁忙的服务器上,无论你启动服务还是修改文件,你都会导致一种多进程都试图在同一个时间缓存同一个文件的竞争。这个选项设置了进程跳过试图去缓存一个未被缓存的文件的百分比。或者可以把这个想象成一个单独进程跳过缓存的机率。例如,设置apc.slam_defense为75就意味着进程有75%的机率不去缓存未被缓存的文件。所以,设置的越高,越能减少缓存的碰撞机率。设置为0则禁用这个特性。
apc.file_update_protection 整型
当你在一个运行着的服务器上修改文件时,你应该执行原子操作。也就是,先写一个临时文件,当写完后再重命名(mv)这个文件到它的最终位置。许多文本编辑器,cp,tar和其他一些类似程序都不是这样操作的。这就意味着有机会去访问和(缓存)文件,当这个文件还在被写的情况下。apc.file_update_protection的设置使得缓存标记新文件的延迟。默认值是2,意味着如果发现文件的修改时间距离访问时间不到2秒,文件将不会被缓存。访问写到一半的文件的不幸用户将会看到离奇的情况,但至少这种情况不是持续的。如果你确信你经常使用原子操作来更新你的文件,你可以关闭这个保护通过设置这个参数为0。如果你的系统充满io操作,并导致更新程序花费超过2秒,你可能需要去增大这个值。
apc.enable-cli 整型
大多是为了测试和调试。为CLI版本的PHP开启动APC功能。一般来说,你将不会想到为每一个 CLI请求创建,移植和放弃APC的缓存,但对于各种测试情况,这是很容易的为了CLI版本开启APC。
代码如下 | 复制代码 |
array( array( array( array( array( array( array( /** static $level = 0; $returnArray = array(); foreach ($data as $node) if (hasChild($node['cid'], $data)) $returnArray = array_merge($returnArray, createMenuTree($data, $node['cid'])); $level--; return $returnArray; /** foreach ($data as $node) return $hasChild; header('Content-Type: text/html; charset=utf-8'); $result = createMenuTree($cates); foreach ($result as $row) echo $row['cname'] . "n"; |
相关文章
- 当来访者浏览器语言是中文就进入中文版面,国外的用户默认浏览器不是中文的就跳转英文页面。 <?php $lan = substr( $HTTP_ACCEPT_LANGUAGE,0,5); if ($lan == "zh-cn") print("<meta http-equiv='refresh' c...2015-11-08
- 腾讯视频怎么放到自己的网页上?这个问题是一个基本的问题,要把腾讯视频放到自己的网页有许多的办法,当然一般情况就是直接使用它们的网页代码了,如果你要下载资源再放到...2016-09-20
- 这篇文章主要介绍了基于JavaScript实现网页倒计时自动跳转代码 的相关资料,需要的朋友可以参考下...2015-12-29
PowerShell读取文件内容、替换文件内容、读取限定行的例子
这篇文章主要介绍了PowerShell读取文件内容、替换文件内容、读取限定行的例子,本文使用3个例子来说明实现这3个需求的操作技巧,需要的朋友可以参考下...2020-06-30网页头部声明lang=”zh-cn”、lang=“zh”、lang=“zh-cmn-Hans”区别
我们现在使用的软件都会自动在前面加一个申明了,那么在网页头部声明lang=”zh-cn”、lang=“zh”、lang=“zh-cmn-Hans”区别是什么呢?下面我们就一起来看看吧. 单...2016-09-20- 这篇文章主要介绍了C#实现Winform中打开网页页面的方法,涉及WinForm中WebBrowser的相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 本文主要介绍了jQuery中取消后续执行内容的实例,代码通俗易懂。需要的朋友来看下吧...2016-12-02
- 在做ajax无刷新时,我想很多朋友都会知道js innerHTML来更改 div 或table里面的值哦. JavaScript的innerHTML 永远不知道你可以改变的内容,一个HTML元素?也许你要...2016-09-20
- 这篇文章主要介绍了Go语言通过http抓取网页的方法,实例分析了Go语言通过http操作页面的技巧,需要的朋友可以参考下...2020-05-05
JS清除文本框内容离开在恢复及鼠标离开文本框时触发js的方法
多网站的需要填写的文本框在默认状态下都会给出一个默认的提示语言,当鼠标点击此文本框的时候能够将里面的默认文本清除,当删除输入的文本且焦点离开文本框的时候再将默认的文本写入文本框...2016-01-14- 本文主要一步一步介绍利用C#抓取页面数据的过程,抓取HTML,获取标题、描述、图片等信息,并去除HTML,希望对大家有所帮助。...2020-06-25
- 本例子不是读取Excel或生成新的Excel,而是读取现有的Excel文件,然后修改Excel中的数据,就像修改mysql中数据一样的哦。 代码如下 ...2016-11-25
- 这篇文章主要介绍了vue如何在用户要关闭当前网页时弹出提示的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-01
- 现在专业性的网站越来越多,许多网友们都在网上建立起了自己的小家。不过辛辛苦苦制作的网页被人拿去改头换面却是件非常痛心的事,所以大家都想保护自己独创的...2016-09-20
- 本文主要讲了安卓7.1.1系统更新的主要内容,有兴趣的朋友快来看一看吧! 虽然你的Android设备可能还都没吃上棉花糖,但谷歌可是已经发布了最新的Android 7.1.1,如果是N...2016-12-15
- 1、检查标题。2、检查版权信息,尤其是电话号码。3、图片、文件定位问题。4、产品页面首页指向产品类别问题。5、文章页面首页指向文章类别问题。6、产品图片大小...2016-09-20
- 在制作网页的时候,常常要遇到制作虚线表格的问题,下面的文章就能解决这个问题。 方法一:作一个1X2的图。 半黑半白,再利用表格作成线。这种方法虽然麻烦...2016-09-20
ASP.NET使用HttpWebRequest读取远程网页源代码
本文分享了一个使用HttpWebRequest读取远程网页的案例,供大家参考学习。...2021-09-22使用C# CefSharp Python采集某网站简历并且自动发送邀请短信的方法
这篇文章主要给大家介绍了关于如何使用C# CefSharp Python采集某网站简历并且自动发送邀请短信的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧...2020-06-25- ...2015-12-29