ZEND FRAMEWORK要想正常的在ubuntu的AMP平台下运行 ,得打开apache的rewrite模块。这和windows下面把rewrite前的注释去掉可不一样。
进入命令行:a2enmod rewrite
会提示你成功打开rewrite模块
然后:
/etc/init.d/apache2 force-reload
重新加载一下,不过,这样还是不能成功的,因为默认的virtualhost中 有一个参数的值默认为NONE,要改成ALL
运行 :
vim /etc/apache2/sites-enabled/000-default
修改
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
把AllowOverride None 的 None 改为 All
然后
/etc/init.d/apache2 restart
OK,现在运行ZEND的例子,正常了吧,呵呵
如果按照ZEND的手册,在使用Zend_Paginator类的时候有两种方法,一种是直接new,一种是用factory
当然,用factory是很方便的。只需要Zend_Paginator::factory( $array )就行了
可是,如果这个array很大怎么办?它没有说。。
即使是new Zend_Paginator( Zend_Db_xxx ?$array )[不记得括号中是哪个abstract了],如果数据量大,他也没办法的呀??
今天白天我试着一下子查询了1W多条,立马死掉。
我看网上的例子,大多是要么直接传结果,要么是传 ZEND_DB的查询对象进去。但结果集都不大的,所以顺利运行 了。我不知道结果集是上万的时候会怎么样,呵呵
最后我是采用了先COUNT出总数,然后用range生成一个大数组传组 Zend_Paginator::factory() ,因为我看他里面的计数是用count的,所以我对factory的数组参数就直接传了这个range出来的数组给它。
结果,成功了,看来,这也就可以了。只是方法有点妖而己。。
记录一下,备忘一下。
Config文件
[paginator]
page.pagemax = 10
page.pagestart = 1
page.itemperpage = 25
在文件里
PHP代码
- <?php
-
- $request = $this->_request ;
- $currentPage = $request->getParam('page');
- $result = $table->fetchAll( ... 条件 );
- $resultCount = $table->getCount( ... 条件 );
- $resultCountArray = range( 1, $resultCount );
-
- $paginator = Zend_Paginator::factory( $resultCountArray );
- $paginator->setCurrentPage( $currentPage )
- ->setItemPerPage( 25 )
- ->setPageRange( 10 );
- $this->view->paginator = $paginator;
部分参数在获取失败的情况下,会直接从Config文件里读取,这里就不详细写了,大致应该是:
PHP代码
- <?php
-
- $config = new Zend_Config_Ini('...path...' , 'paginator' );
-
- $pageMax = $config->page->pagemax ;
-
这四个命令可能用的最多的还是chmod,改变权限
该命令在PHP中有模拟实现,在linux下使用方法大致为
chmod -R 0777 目录名
参数 -R 表示遍历
该变目录的所有者
chown -R aaa.bbb 目录名
-R同样为遍历 aaa为组bbb为用户
chgrp 好象没有-R 功能,用法与chown一样
tar功能常用的就是解压和打包
解压时,大多为tar zxvf xxxx.tar.gz
打包时:tar zxvf xxx.tar.gz 目标目录
在ubuntu SERVER最初创建的时候就可以选择samba进行安装,如果你没有安装过,那就先运行
apt-get install samba
在网上看到还有资料写需要安装smbfs,不知道有没有什么用。
安装成功后,进入samba目录:/etc/samba
先备份,smb.conf文件
cp smb.conf smb.conf.bak
然后打开smb.conf
找到 ; security = user
把前面的分号注释掉,再加上一行
username map = /etc/samba/smbusers
(这个文件是不存在的,到时候需要单独建立)
还在smb.conf文件里,找到[global]
默认在ubuntu里面workgroup = WORKGROUP,好象说有的版本是 workgroup = MSHOME,如果是这种就改为WORKGROUP吧,毕竟在XP里面工作组都是workgroup
再加上:
display charset = UTF-8
unix charset = UTF-8
dos charset = cp936
再到文件的结束处加上
[www]
comment = '这是该共享的注释'
path = /var/www
public = yes
writable = yes
valid users = www
create mask = 0777
directory mask = 0777
force user = nobody
force group = nogroup
available = yes
browseable = yes
保存退出。
然后打开smbusers文件,加入
www = "netwok username"
保存退出
运行
useradd www
添加一个Www用户
再运行smbpasswd -a www
为www的访问设定一个密码
现在就OK了,使用testparm看一下smb的情况
最后/etc/init.d/samba restart
重启。
OVER
在windows下面就可以访问了。。。
下面是对配置的简单注释
[www] //这是共享时显示的名称
comment = '这是该共享的注释' //注释
path = /var/www //路径
public = yes //是否开放
writable = yes //是否可写
valid users = www //访问的用户
create mask = 0777 //创建权限 (0777为最大权限)
directory mask = 0777 //目录权限
force user = nobody //目标用户
force group = nogroup//目标组
available = yes //是否启用
browseable = yes //是否可浏览
突然怀念起几年前,walkerlee、hihiyou、我还在为了NC进行打拼,也曾为了某个正则几乎通宵不睡在测试。其实在NC前已经有过多款的采集软件,但其实都是属于功能单一情况,如:开花石头的逆向小偷等。NC只是一款整合了一起功能的采集软件,也算是开创了先河吧?反正自那以后,采集程序越来越多,先是剑枫,然后是小蜜蜂,再后来是火车头,采集软件越来越多之后,随之而来的就是性能问题,采用WEB方式的采集,不可避免的就是性能。你没有办法控制一个WEB页面不会超时,而且PHP由于自身的执行方式,也就不可能是多线程执行,后来大多数人,采用了iframe的方式,让一个页面打开十个左右的iframe然后根据执程的ID来进行判断。
过去的事情,总是让人怀念,在看到这个作者写类似的采集时,感慨的同时,留一份备份,以作纪念
原文:http://www.cnblogs.com/hongyin163/archive/2009/02/11/1388615.html
内容:
最近公司需要开发一个简历导入功能,类似博客搬家或者邮箱搬家,之前抓取信息是利用火车采集器,但是简历导入功能需要用户登陆以后才能获取简历数据,无奈只好自己开发了。
首先是遇到的问题是:如何实现模拟登陆?
我们知道一般的网站都是通过Cookies来维护状态的,我抓的网站也是支持利用Cookies来验证用户的,构造一个post数据包,向服务器提 交数据,在配置火车采集器的时候,也是要先利用WSockExpert.exe工具获得Post数据包,之后修改用户名和密码,向服务器提交的。
提交了登陆数据后还没完成登陆,虽然服务器会返回登陆后的页面数据,但是如果在进入其他的链接页面,还是不允许的,因为服务器每次都需要通过你提交 过去Cookies来验证你是否登陆,在asp.net里,利用Cookies存储身份验证票证,每次都需要向服务器提交的,初学asp.net总是弄不 明它的form验证机制,它封装了太多信息,虽然用几行代码就能实现验证,后来看了些web开发基础知识才弄明白,在这个你需要保存上次登陆后返回的 Cookies,在下次有其他请求时带上这个Cookies就可以了,怎么带上呢?下面是我在.net里的实现,很简单!
利用HttpWebRequest类的CookieContainer来保存,这个CookieContainer会保存服务器回传的 Cookies,但是前提是你在初始化HttpWebRequest的时候,记得实例化这个CookieContainer,一般的请求不需要实例它的, 简单的代码如下:
httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(URL);
httpWebRequest.CookieContainer = new CookieContainer();
httpWebRequest.ContentType = "application/x-www-form-urlencoded";
httpWebRequest.Method = "POST"
为了能全局使用这个CookieContainer ,你可以把它作为全局变量,这样在下次request的时候将其赋给CookieContainer 属性就行了。
详细了解CookieContainer 见:http://msdn.microsoft.com/zh-cn/vstudio/system.net.cookiecontainer(VS.80).aspx
维护了这个CookieContainer 后,我们就可以访问登陆后的页面了,模拟登陆问题解决。
其次遇到的问题自然是:如果从网页上获得想要的信息?
要在网页抓取信息,实现起来最简单,同时也是最繁琐的方法,那就是模板方法获取了,从火车采集器的配置过程看出来,它也就是用这种方法而已,不过 人家能把抓取器做成成熟的产品,并且热卖,这个比不了,所以成功与否不完全取决于技术,火车采集器虽然配置起来挺繁琐,但是用起来还不错。
用这种方式你需要做个一个模板,你需要知道目标网页的结构,知道要找的信息在什么地方,之后记录在它的前面和后面的字符串,你可以利用截取字符串的 方式获得目标信息,也可以利用正则标式获得,要保证前面和后面的字符串是唯一的,很简单,计算一下,或者匹配一下就可以获得目标信息,但是实际做起来还是 会遇到一些问题:
下面是我遇到问题;
1.首先我是想利用正则表达式匹配,但是模块里设置的前缀和后缀里有回车换行\r\n,结果总是匹配不成功,我正则的功底很差,最后知道怎么回事了,把\r\n替换成(\s*),问题解决,您可以想出为什么了吧?
2.利用字符串截取方式获取,在正则还不是很精通,用这种方式最保险了,但是在截取字符串前记得调整下目标页代码,从xml配置文件里读取的前缀和 后缀中可能有回车和换行,但是回车换行在不同系统里字符表现是不一样的,Windows里是\r\n,Linux里是\n,所以要记得统一。
3.前后缀不唯一,有时在页面里有两个不同的目标信息,但却有相同的前缀,比如:
<td width="25%" class="ResTbLfPd">数据库</td>
<td width="25%" class="ResTbLfPd">软件工程师</td>
如果用相同的前缀就比较难截到想要的信息了,我想了个办法,当然方法可能比较笨,但是问题解决了,也是火车给我的启示,利用多个字符串定位目标信息,比如我想抓去 软件工程师 ,前缀就是:
<td width="25%" class="ResTbLfPd">*</td>
<td width="25%" class="ResTbLfPd">
在信息可能不同的地方用*代替,类似通配符,这样利用*将一个字符串切割为两个,先找到第一个,之后以这个索引位置为起点,再找第二个字符串,这样就可以定位到最终的信息了,同样可以用多个字符串三个或更多,这样实现是解决了问题,希望有更好的方式,希望以后会改进。
4.在抓取信息的时候还可以利用MITHtmlPparser,这是一个开源的类库,在codeproject找搜到的,将网页内的所以标签都分析出来,如果获取信息不是很多、很碎的话,用这个也比较好用,只需知道那个最终要得到信息在那个标签里,然后直接取出就行了。
好了,希望在新的一年里能学到更多,能经得住考验!