PHP 网站安装实现程序
这次顺便做了一个install.php才发现难度其实并不大,还是文件写入操作而已,安装其实主要操作的还是数据库里的内容,先来看看文件里怎么写:(还是用的Codeigiter,对于使用其他框架或者手写而言,仅思路可参考,用了挺多CI自带的helper或者是library的)
代码如下 | 复制代码 |
$content = "<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');n"; $content .= '$active_group'. "= 'default';n"; $content .= '$active_record'." = TRUE;n"; $content .= '$db'."['default']['hostname'] = '".$this->input->post('hostname')."';n"; $content .= '$db'."['default']['username'] = '".$this->input->post('rootname')."';n"; $content .= '$db'."['default']['password'] = '".$this->input->post('pass')."';n"; $content .= '$db'."['default']['database'] = '".$this->input->post('book')."';n"; $content .= '$db'."['default']['dbdriver'] = 'mysql';n"; $content .= '$db'."['default']['dbprefix'] = '';n"; $content .= '$db'."['default']['pconnect'] = TRUE;n"; $content .= '$db'."['default']['db_debug'] = TRUE;n"; $content .= '$db'."['default']['cache_on'] = FALSE;n"; $content .= '$db'."['default']['cachedir'] = '';n"; $content .= '$db'."['default']['char_set'] = 'utf8';n"; $content .= '$db'."['default']['dbcollat'] = 'utf8_general_ci';n"; $content .= '$db'."['default']['swap_pre'] = '';n"; $content .= '$db'."['default']['autoinit'] = TRUE;n"; $content .= '$db'."['default']['stricton'] = FALSE;"; |
在文件里用n来换行,因为里面包括了PHP的代码,这导致了我们只能用双引号避免冲突(否则的话就得用了,感觉工作量更大),针对$db,直接显示必须要用单引号,于是就出现了这个。
写入文件之后,接着我们需要做的是执行一系列安装操作,也就是CREATE TABLE,以及创建一个新用户用于登陆,在model里,我这么写:
代码如下 | 复制代码 |
function install() { if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_category'")) == 0) $this->db->query("CREATE TABLE pr_category(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, category VARCHAR(100) NOT NULL UNIQUE, deadline INT NOT NULL)"); if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_college'")) == 0) $this->db->query("CREATE TABLE pr_college(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) NOT NULL UNIQUE)"); if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_level'")) == 0) $this->db->query("CREATE TABLE pr_level(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, level INT NOT NULL, name VARCHAR(20) NOT NULL)"); if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_rates'")) == 0) $this->db->query("CREATE TABLE pr_rates(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, pid INT NOT NULL, ip VARCHAR(40) NOT NULL, category INT NOT NULL)"); if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_users'")) == 0) $this->db->query("CREATE TABLE pr_users(uid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, username VARCHAR(45) NOT NULL UNIQUE, password VARCHAR(50) NOT NULL, level INT NOT NULL )"); if (mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_works'")) == 0) $this->db->query("CREATE TABLE pr_works(pid INT NOT NULL PRIMARY KEY AUTO_INCREMENT, title VARCHAR(100) NOT NULL, content TEXT, realname VARCHAR(20) NOT NULL, studentnum VARCHAR(20) NOT NULL, college INT NOT NULL, filename TEXT NOT NULL, category INT NOT NULL)"); $query1 = $this->db->get_where('pr_level',array('level' => 1, 'name' => '普通用户')); $query2 = $this->db->get_where('pr_level',array('level' => 5, 'name' => '管理员')); $query3 = $this->db->get_where('pr_level',array('level' => 99, 'name' => '超级管理员')); if ($query1->num_rows() == 0) $this->db->query("INSERT INTO pr_level(level, name) VALUES (1, '普通用户')"); if ($query2->num_rows() == 0) $this->db->query("INSERT INTO pr_level(level, name) VALUES (5, '管理员')"); if ($query3->num_rows() == 0) $this->db->query("INSERT INTO pr_level(level, name) VALUES (99, '超级管理员')"); $this->username = $this->input->post('username'); $this->password = $this->input->post('password'); $this->level = 99; $query4 = $this->db->get_where('pr_users',array('username' => $this->input->post('username'))); if ($query4->num_rows() == 0) { $this->db->insert('pr_users', $this); return TRUE; } else { return FALSE; } } |
其实这么写查询量很大效率又低,不过这有效的避免了上一次安装被打断之后重新安装遇到的麻烦,检测是否已经创建了某个表,是否已经有新用户了之类的。
代码如下 | 复制代码 |
mysql_num_rows(mysql_query("SHOW TABLES LIKE 'pr_category'")) |
这句可以查询数据库中是否存在这个表。
执行完如果顺利的话,将install.php改个名字:
代码如下 | 复制代码 |
rename('application/controllers/install.php', 'application/controllers/install.lock'); |
在其他文件里加入检测install.php是否存在,如果存在的话就跳转到install.php,这样就做好了简单的安装流程了(必须放在model前,否则会提示没有数据库而不会跳转)。
代码如下 | 复制代码 |
if (file_exists('application/controllers/install.php')) redirect('install'); |
至于什么是否存在表之类的,因为CI会check而且优先级也高于我们自己写的错误提示,所以这里就不加了。
完整源码(MVC):
Controller:
代码如下 | 复制代码 |
<?php class Install_model extends CI_Model { <!DOCTYPE html> |
“通过DNSPod 提供的D监控 URL 回调功能,您可以让宕机或恢复信息提交到您指定的 URL 上,从而更加灵活地处理各种通知信息。”
我们可以通过宕机之后的URL回调取得相关参数,并通过DNSPOD API实现自动修改记录的功能,再通过飞信发送宕机通知。
代码在后面,先说设置方法:
设置方法
1.点此下载代码,修改其中的参数为你自己的。
2.将代码上传到网站。
3.在DNSPOD开启D监控,在通知设置中回调URL一栏填入monitorCallback.php的地址,如http://blog.gimhoy.com/monitorCallback.php?rHost=hipic.sinaapp.com.其中rHost是SAE的二级域名。并设置回调密钥。
4.Enjoy~
dnspod-monitor-callback
代码
monitorCallback.php
代码如下 | 复制代码 |
/* $monitor_id = $_POST['monitor_id']; // 监控编号 if (md5($monitor_id. $domain_id. $record_id. $callback_key. $created_at) != $checksum) { // 处理完成 dnspod.class.php /* class dnspod { $result = $this->post_data($api, $data); if (!$result) { |
Fetion.class.php
代码如下 | 复制代码 |
header('Content-Type: text/html; charset=utf-8'); //解析Cookie return $result; $this->_csrfToten = isset($matches[1]) ? $matches[1] : ''; return $this->_csrfToten; /** $this->_uids[$mobile] = isset($matches[1]) ? $matches[1] : ''; $result = ''; fclose($fp); return $result;
|
做这个之前,没有接触过php压缩这一块,网上搜了一些,大多数都是php压缩类、压缩函数,少则几百行,多的就几千行代码。这对于我这种新手来说很摸不到头脑,再说我也不用这么复杂的功能。最后参考函数手册,理清楚了几个相关的函数后,就明白了怎么去整了。
PHP Zip File 函数
记得要开启 zip ,把 php.ini 中的 extension=php_zip.dll 前面的分号去掉。
源码范例:
代码如下 | 复制代码 |
//phpinfo(); header("Content-type:text/html;charset=utf-8");
//先判断待解压的文件是否存在 if(!file_exists($filename)){ die("文件 $filename 不存在!"); } $starttime = explode(' ',microtime()); //解压开始的时间 //将文件名和路径转成windows系统默认的gb2312编码,否则将会读取不到 $filename = iconv("utf-8","gb2312",$filename); $path = iconv("utf-8","gb2312",$path); //打开压缩包 $resource = zip_open($filename); $i = 1; //遍历读取压缩包里面的一个个文件 while ($dir_resource = zip_read($resource)) { //如果能打开则继续 if (zip_entry_open($resource,$dir_resource)) { //获取当前项目的名称,即压缩包里面当前对应的文件名 $file_name = $path.zip_entry_name($dir_resource); //以最后一个“/”分割,再用字符串截取出路径部分 $file_path = substr($file_name,0,strrpos($file_name, "/")); //如果路径不存在,则创建一个目录,true表示可以创建多级目录 if(!is_dir($file_path)){ mkdir($file_path,0777,true); } //如果不是目录,则写入文件 if(!is_dir($file_name)){ //读取这个文件 $file_size = zip_entry_filesize($dir_resource); //最大读取6M,如果文件过大,跳过解压,继续下一个 if($file_size<(1024*1024*6)){ $file_content = zip_entry_read($dir_resource,$file_size); file_put_contents($file_name,$file_content); }else{ www.111cn.net echo "<p> ".$i++." 此文件已被跳过,原因:文件过大, -> ".iconv("gb2312","utf-8",$file_name)." </p>"; } } //关闭当前 zip_entry_close($dir_resource); } } //关闭压缩包 zip_close($resource); $endtime = explode(' ',microtime()); //解压结束的时间 $thistime = $endtime[0]+$endtime[1]-($starttime[0]+$starttime[1]); $thistime = round($thistime,3); //保留3为小数 echo "<p>解压完毕!,本次解压花费:$thistime 秒。</p>"; }
|
测试解压了一个300多KB的小文件,花了0.115秒,测试解压了一个30多MB的(网页文件,小文件比较多),花了20多秒。
php解压程序
跟系统比起来确实慢了一些,但是这也很不错了!刚刚入门,代码还不优良,但是实现了解压,而且代码也比网上的简介易懂,如果你看到这篇文章,相信对你是有帮助的!程序中用到了程序运行的时间,具体可以看看: 。
最后,我觉得:
代码如下 | 复制代码 |
//最大读取6M,如果文件过大,跳过解压,继续下一个 if($file_size<(1024*1024*6)){ $file_content = zip_entry_read($dir_resource,$file_size); file_put_contents($file_name,$file_content); } |
这一块做的不太好,这样对大文件解压就没办法了,等会再优化一下。
需要安装imagick及其php扩展。一共有二个函数,都是从网上摘下来的,还没测试,这个方案应该可行,可以简单的仿照在线文档功能,有机会在项目中实践一下第一种
代码如下 | 复制代码 |
/** * PDF2PNG * @param $pdf 待处理的PDF文件 * @param $path 待保存的图片路径 * @param $page 待导出的页面 -1为全部 0为第一页 1为第二页 * @return 保存好的图片路径和文件名 */ function pdf2png($pdf,$path,$page=0) { if(!is_dir($path)) { mkdir($path,true); } if(!extension_loaded('imagick')) { echo '没有找到imagick!' ; return false; } if(!file_exists($pdf)) { echo '没有找到pdf' ; return false; } www.111cn.net $im = new Imagick(); $im->setResolution(120,120); //设置图像分辨率 $im->setCompressionQuality(80); //压缩比 $im->readImage($pdf."[".$page."]"); //设置读取pdf的第一页 //$im->thumbnailImage(200, 100, true); // 改变图像的大小 $im->scaleImage(200,100,true); //缩放大小图像 $filename = $path."/". time().'.png'; if($im->writeImage($filename) == true) { $Return = $filename; } return $Return; } $s = pdf2png('file/1371273225-ceshi_ppt.pdf','images'); echo '<div align="center"><img src="'.$s.'"></div>'; |
第二种
代码如下 | 复制代码 |
function pdf2png($PDF,$Path){ if(!extension_loaded('imagick')){ return false; } if(!file_exists($PDF)){ return false; } $IM = new imagick(); $IM->setResolution(120,120); $IM->setCompressionQuality(100); $IM->readImage($PDF); foreach ($IM as $Key => $Var){ $Var->setImageFormat('png'); $Filename = $Path.'/'.md5($Key.time()).'.png'; if($Var->writeImage($Filename) == true){ $Return[] = $Filename; } www.111cn.net } return $Return; } |
创建一个jpg缩略图并显示出来
代码如下 | 复制代码 |
<?php header('Content-type: image/jpeg'); $image = new Imagick('image.jpg'); // If 0 is provided as a width or height parameter,// aspect ratio is maintained $image->thumbnailImage(100, 0); echo $image; ?> |
缩略GIF动画图片
代码如下 | 复制代码 |
<?php /* Create a new imagick object and read in GIF */ $im = new Imagick("example.gif"); /* Resize all frames */ foreach ($im as $frame) { /* 50x50 frames */ $frame->thumbnailImage(50, 50); /* Set the virtual canvas to correct size */ $frame->setImagePage(50, 50, 0, 0); }/* Notice writeImages instead of writeImage */ $im->writeImages("example_small.gif", true); ?> |
json_encode这个函数作用是起到不同语言之间数据传递的作用,尤其是php对js之间数据交换十分方便。
但是json_encode这个函数在使用的时候需要注意几点:
1 所传输的数据必须是UTF8格式的
2 需要对中文做一些URLENCODE处理
json_encode中文为null解决
原因分析:使用json_encode函数应应使用utf-8编码,我的页面用的是gbk.
解决:在json_encode函数前使用iconv('gbk','utf8')函数。
代码如下 | 复制代码 |
function gbk2utf8($data){ |
这样显示出来的会是如{"item1":1,"item2":"u4e2du6587"} 格式了,虽然空解决了,但是没显示汉字呀。
我们再来分析一下
例如:'胥'经过json_encode处理后变为'u80e5',最终的json中中文部分被替换为unicode编码。我们要解决的就是将对象转换为json并保证对象内部的中文在json中仍然是以正常的中文出现,现在看来只使用json_encode是不能达到目的的。www.111cn.net
我的解决方法:先将类中的中文字段进行url编码(urlencode),然后再对对象进行json编码(jsonencode),最后url解码(urldecode)json,即最终的json,里面的中文依旧是那个中文!
代码如下 | 复制代码 |
<?php 查看输出结果为: {“name”:”中文字符串”,”value”:”test”} |
到此,成功地输出了中文字符。随意使用json_encode吧。这样子在PHP后台输出的JSON字符串在前台javascript中Ajax接收后eval出来也不会出现中文乱码,因为js在处理JSON格式数据是也是以UTF8的形式进行的,与PHP类似,故接收PHP页面的JSON字符串不会出现问题。
下面是对json_encode这个函数做一些完善
代码如下 | 复制代码 |
<?php |
相关文章
- 编译安装非常的简单了我们现在的php版本已经到了php7了,下文小编来为各位介绍一篇关于PHP7快速编译安装的步骤,希望文章能够帮助到各位。 一、安装必要一些依赖 yum...2016-11-25
- php语言实现redis的客户端与服务端有一些区别了因为前面介绍过服务端了这里我们来介绍客户端吧,希望文章对各位有帮助。 为了更好的了解redis协议,我们用php来实现...2016-11-25
- 有时我们在页面上需要选择数值范围,如购物时选取价格区间,购买主机时自主选取CPU,内存大小配置等,使用直观的滑块条直接选取想要的数值大小即可,无需手动输入数值,操作简单又方便。HTML首先载入jQuery库文件以及jRange相关...2015-03-15
- 这篇文章主要介绍了Rstudio中安装package出现的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
- 获取网站icon,常用最简单的方法就是通过website/favicon.ico来获取,不过由于很多网站都是在页面里面设置favicon,所以此方法很多情况都不可用。 更好的办法是通过google提供的服务来实现:http://www.google.com/s2/favi...2014-06-07
- 本文实例讲述了JS实现的简洁纵向滑动菜单(滑动门)效果。分享给大家供大家参考,具体如下:这是一款纵向布局的CSS+JavaScript滑动门代码,相当简洁的手法来实现,如果对颜色不满意,你可以试着自己修改CSS代码,这个滑动门将每一...2015-10-21
- PHP-FPM我们相信各位用高版本的php经常使用到了,下面整理了一些关于PHP-FPM的笔记,有兴趣的可进来看看。 今天赶上了123System OPenVZ VPS全场半价的机会,购入了一...2016-11-25
jQuery+slidereveal实现的面板滑动侧边展出效果
我们借助一款jQuery插件:slidereveal.js,可以使用它控制面板左右侧滑出与隐藏等效果,项目地址:https://github.com/nnattawat/slideReveal。如何使用首先在页面中加载jquery库文件和slidereveal.js插件。复制代码 代码如...2015-03-15安装和使用percona-toolkit来辅助操作MySQL的基本教程
一、percona-toolkit简介 percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,这些任务包括: 检查master和slave数据的一致性 有效地对记录进行归档 查找重复的索...2015-11-24Linux安装Pytorch1.8GPU(CUDA11.1)的实现
这篇文章主要介绍了Linux安装Pytorch1.8GPU(CUDA11.1)的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-25- 翻板抽奖的实现流程:前端页面提供6个方块,用数字1-6依次表示6个不同的方块,当抽奖者点击6个方块中的某一块时,方块翻转到背面,显示抽奖中奖信息。看似简单的一个操作过程,却包含着WEB技术的很多知识面,所以本文的读者应该熟...2015-10-21
- 这篇文章主要介绍了vscode安装git及项目开发过程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-19
mac下Apache + MySql + PHP搭建网站开发环境
首先为什不自己分别搭建Apache,PHP和MySql的环境呢?这样自己可以了解更多知识,说起来也更酷。可也许因为我懒吧,我是那种“既然有现成的,用就是了”的人。君子生非异也,善假于物也。两千年前的荀子就教导我们,要善于利用工具...2014-06-07SQLMAP结合Meterpreter实现注入渗透返回shell
sqlmap 是一个自动SQL 射入工具。它是可胜任执行一个广泛的数据库管理系统后端指印, 检索遥远的DBMS 数据库等,下面我们来看一个学习例子。 自己搭建一个PHP+MYSQ...2016-11-25- 这篇文章主要为大家详细介绍了Visual Studio 2015下载和安装图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
- 现在我们介绍一种在Node下检查简单错误的JS代码验证工具JSHint。 JSHint的具体介绍参考http://www.jshint.com/about/,说直白点儿,JSHint就是一个检查JS代码规范与否的工具,它可以用来检查任何(包括server端和client端...2014-05-31
Centos中彻底删除Mysql(rpm、yum安装的情况)
我用的centos6,mysql让我整出了各种问题,我想重装一个全新的mysql,yum remove mysql-server mysql之后再install并不能得到一个干净的mysql,原来的/etc/my.cnf依然没变,datadir里面的数据已没有任何变化,手动删除/etc/my.cn...2015-03-15- 这篇文章主要介绍了在PyCharm中安装PaddlePaddle的方法,本文给大家介绍的非常想详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-05
- 复制代码 代码如下: // 第一种写法 $da = date("w"); if( $da == "1" ){ echo "今天是星期一"; }else if( $da == "2" ){ echo "今天是星期二"; }else if( $da == "3" ){ echo "今天是星期三"; }else if( $da == "4"...2013-10-04
- 这篇文章主要介绍了linux服务器快速卸载安装node环境(简单上手),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-22