php下载, php读取文件 更改文件名后提供下载,php获取文件后下载,php文件更名后下载

php下载, php读取文件 更改文件名后提供下载,php获取文件后下载,php文件更名后下载

$url = $filename = dirname(__FILE__) . '/oldfilename.exe';
$out_filename = 'newFileName.exe';
// We'll be outputting a file
@header('Accept-Ranges: bytes');
@header('Accept-Length: ' . filesize($url));
// It will be called
@header('Content-Transfer-Encoding: binary');
@header('Content-type: application/octet-stream');
@header('Content-Disposition: attachment; filename=' . $out_filename);
@header('Content-Type: application/octet-stream; name=' . $out_filename);
// The source is in filename
$file = @fopen($url, "r");
echo @fread($file, @filesize($url));
@fclose($file);
exit;

来源:http://www.oschina.net/code/snippet_113490_12636

mysql慢查询记录,mysqlbinlog用法,详细mysqlbinlog配置,mysql log-bin设置

mysql可以记录所有查询很慢的记录并把sql语句记录在指定的文件中,也可以通过mysqlbinlog记录添加更新 等记录,也可以通过mysqlbinlog进行数据库还原。

mysql慢查询记录
编辑my.cnf文件
linux通常在/etc/my.cnf 或者/usr/local/mysql/etc/my.cnf
windows 自己找

在[mysqld]标签在下面加上:

log-slow-queries=/var/lib/mysql/slow.log #慢日志保存路径,该文件自己新建
long_query_time=2 #超过2秒的查询
;log-queries-not-using-indexes #记录没有使用索引的查询

开启mysql增量日志记录
同样在[mysqld]标签在下面加如下内容

log-bin=mysqlbin#名称随便取
binlog_cache_size = 4M
binlog_format = MIXED
max_binlog_cache_size = 256M
max_binlog_size = 1G#日志大小
expire_logs_days = 30#记录30天内的日志

mysqlbinlog的日志通常在/var/lib/mysql里面
日志一些简单的查询导出操作,其中mysqlbin.000001是里面的一个日志文件

mysqlbinlog --start-datetime="2013-09-10 00:00:00" --stop-datetime="2013-09-13 23:59:59" mysqlbin.000001 > /root/log.txt

还可以用这些记录来进行数据库还原

fullcalendar实例应用,fullcalendar使用教程,fullcalendar事件更新,日历控件,fullcalendar移动

FullCalendar 是一个 优秀的jQuery 的日历插件,支持请求json数据,支持google 日历接口,是我经过几次不同jquery日历插件对比后筛选出来最优秀的一款。用它做了个有用的功能,当然在使用过程中碰到了很多问题,比如事件更新就是一个让人头疼的东西。

官方提供的几种fullcalendar事件更新办法并不是那么完善,比如在fullcalendar移动事件的时候,有的时候会成功,有的时候不会成功,后经我分析 是在移动过程中,由于高频度的移动,导致一个fullcalendar json没有完全请求返回完成,然后又进行一个新的fullcalendar移动操作。导致fullcalendar事件没有及时更新此时如果迅速移动就会使用原来事件记录的时间信息进行新的移动,所以会导致fullcalendar移动出现偶尔成功 偶尔失败的问题

20130909112255

本例用到的插件有 fullcalendar、WdatePicker、jquery-1.10.2.min.js、jquery-ui-1.10.3.custom.min.js

下面是部分html代码参考

<div id='calendar'></div>
<div style="DISPLAY: none" id="reservebox" title="reservebox">
    <form id="reserveformID" method="post">
        <div class="sysdesc">&nbsp;</div>
        <div class="rowElem"><label>服务器名:</label>
        <input type="text" name="servername" id="server" class=""></div>
        <div class="rowElem"><label>游戏:</label>
        <select id="game" name="game">
            <!--{html_options options=$dict_game[1] selected=$dict_game[0]}-->
        </select>
        <div class="rowElem"><label>合作商:</label>
        <select id="partner" name="partner">
            <!--{html_options options=$dict_platform[1] selected=$dict_platform[0]}-->
        </select>
        </div>
        <div class="timePicker"><label>开服时间:</label>
        <input type="text" maxlength="16" name="start" id="start" onclick="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm'})" value=""></input>
    </form>
</div>

下面是javascript代码参考,主要资料都在这里

<script type="text/javascript">
	function gotoDate(){
		date = document.getElementById("timePicker").value.split(" ")[0];
		date = date.split('-');
		$('#calendar').fullCalendar( 'gotoDate', date[0], parseInt(date[1])-1, parseInt(date[2]));
		//$('#calendar').fullCalendar( 'changeView', 'agendaDay' );
	}

	$(document).ready(function() {
		var date = new Date();
		var d = date.getDate();
		var m = date.getMonth();
		var y = date.getFullYear();

		var calendar = $('#calendar').fullCalendar({
			header: {
				left: 'prev,next today',
				center: 'title',
				right: 'month,agendaWeek,agendaDay'
			},
			buttonText: {today: '今天', month: '月', agendaWeek: '周', agendaDay: '日'},
			dayNames:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],
			dayNamesShort:['日', '一', '二', '三','四', '五', '六'],
			monthNames:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],
			monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],
			selectable: true,
			selectHelper: true,
			editable: true,
			events: "json",
			//单日点击
			dayClick: function(date, allDay, jsEvent, view) {
				var time = $.fullCalendar.formatDate(date, "yyyy-MM-dd hh:mm");
				document.getElementById("start").value = time;
				var selectdate = $.fullCalendar.formatDate(date, "yyyy-MM-dd");
				$( "#reservebox" ).dialog({
					autoOpen: false,
					height: 300,
					width: 400,
					title: '任务 ' + selectdate,
					modal: true,
					position: "center",
					draggable: false,
					buttons: {
						"关闭": function() {
							$(this).dialog( "close" );
						},
						"确认": function() {
							var server_name = $("#server").val();
							var game = $("#game").val();
							var partner = $("#partner").val();
							var start = $("#start").val();
							if (server_name == '' || game < 1 || partner < 1 || start == '') {
								alert('有未填写项目');
								return FALSE;
							}
							$.ajax({
							   type: "POST",
							   url: "http://test.xxtime.com/newserver/add",
							   data: "server_name="+server_name+"&game="+game+"&partner="+partner+"&start="+start,
							   dataType: 'json',
							   contentType: "application/x-www-form-urlencoded; charset=utf-8",
							   success: function(msg){
							   		if (msg.error>0) {
										alert('失败 ' + msg.msg);
										return FALSE;
									}
									// TODO : 更新事件
									setTimeout('$("#calendar").fullCalendar("refetchEvents")', 2000);
							   }
							});
							$(this).dialog( "close" );
						}
					}
				});
				$("#reservebox").dialog( "open" );
				return false;
			},
			//事件点击
			eventClick: function(event, jsEvent, view) {
				if (event.url) {
					return 1;
				}
				$.ajax({
				   type: "POST",
				   url: "http://test.xxtime.com/newserver/detail/",
				   data: "id="+event.id,
				   dataType: 'json',
				   success: function(msg){
				   		$("#server_id").html(msg.server_id);
						$("#server_name").html(msg.server_name);
						$("#game_name").html(msg.cn_name);
						$("#partner_name").html(msg.plat_name);
						var d = new Date(msg.open_time*1000);
						open_time = d.getFullYear()+"-"+(d.getMonth()+1)+"-"+d.getDate()+" "+d.getHours()+":"+d.getMinutes();
  						$("#open_time").html(open_time);
				   }
				});
				$( "#dialog" ).dialog({
					autoOpen: false,
					height: 200,
					width: 400,
					title: '任务信息',
					modal: true,
					position: "center",
					draggable: false,
					buttons: {
						"编辑": function() {
							$(this).dialog( "close" );
							$( "#editbox" ).dialog({
								autoOpen: false,
								height: 300,
								width: 400,
								title: '编辑任务 ' + event.id,
								modal: true,
								position: "center",
								draggable: false,
								buttons: {
									"关闭": function() {
										$(this).dialog( "close" );
									},
									"确认": function() {
										var server_name = $("#editserver").val();
										var game = $("#editgame").val();
										var partner = $("#editpartner").val();
										var start = $("#editstart").val();
										$.ajax({
										   type: "POST",
										   url: "http://test.xxtime.com/newserver/edit",
										   data: "id="+event.id+"&server_name="+server_name+"&game="+game+"&partner="+partner+"&start="+start,
										   dataType: 'json',
										   contentType: "application/x-www-form-urlencoded; charset=utf-8",
										   success: function(msg){
												if (msg.error>0) alert('失败 ' + msg.msg);
										   }
										});
										//更新事件重新渲染
										event.title = server_name;
										event.game_id = game;
										event.partner_id = partner;
										event.start = $.fullCalendar.parseDate(start);
										$('#calendar').fullCalendar('updateEvent', event);
										setTimeout('$("#calendar").fullCalendar("refetchEvents")', 2000);//二次保险更新

										$(this).dialog( "close" );
									}
								}
							});
							$("#editserver").val(event.title);
							$("#editgame").val(event.game_id);
							$("#editpartner").val(event.partner_id);
							$("#editstart").val(event.day + ' ' + event.start.toString().split(" ")[4].substring(0,5));
							$("#editbox").dialog( "open" );
							return false;
						},
						"删除": function() {
							if (confirm('确认删除?')) {
								$.ajax({
								   type: "POST",
								   url: "http://test.xxtime.com/newserver/delete/",
								   data: "id="+event.id,
								   dataType: 'json',
								   success: function(msg){
								   		if (msg.error>0) alert('失败 ' + msg.msg);
								   }
								});
								$(this).dialog( "close" );
								$("#calendar").fullCalendar("removeEvents",event.id);
							}
						}
					}
				});
				$("#dialog").dialog( "open" );
				return false;
			},
			eventRender: function(event, element) {
				var start = $.fullCalendar.formatDate(event.start, "HH:mm");
				var end = $.fullCalendar.formatDate(event.end, "HH:mm");
				element.html("<div class='fc-event-inner'><span class='fc-event-title'>"+start+" "+event.title+"</span></div><div class='fc-event-bg'></div>");
			},
			//事件移动
			eventDrop: function(event, dayDelta, minuteDelta, allDay, revertFunc, jsEvent, ui, view) {
				timeChanged = (dayDelta * 24 * 60 + minuteDelta) * 60;
				$.ajax({
				   type: "POST",
				   url: "http://test.xxtime.com/newserver/edit",
				   data: "id="+event.id+"&timeChanged="+timeChanged,
				   dataType: 'json',
				   success: function(msg){
				   		if (msg.error>0) alert('失败 ' + msg.msg);
				   }
				});
				// TODO : 更新事件
				setTimeout('$("#calendar").fullCalendar("refetchEvents")', 2000);
			},
			//事件缩放
			eventResize: function( event, dayDelta, minuteDelta, revertFunc, jsEvent, ui, view ) {
			}
		});

	});
</script>

微谈苹果越狱后的安全问题,ipad,iphone相片软件等,所有资料都暴露在公众视野

很多朋友都喜欢苹果越狱,确实可以能有更灵活的一个使用性,但是却存在极大的安全隐患,(毫不夸张的讲)

为什么这么说,编程人员都知道我们用 ssh、putty这样的客户端是可以连接 linux,Unix,Mac系统的(其实Mac系统也是Unix的衍生版本)
通过连接,我们可以管理这些系统的所有内容(只要有足够的权限,比如root)

而ipad越狱,iphone越狱后 就会开启root权限,而且密码还是众所周知的。
账号:root(系统最高权限账号)
密码:alpine

这样比如你在一个公用的wifi网段下 比如公司wifi 合租屋wifi,如果别人看到你了(路由管理通常会标识客户端名称 如果你用iphone会有iphone字样,所以发现你用iphone很容易)
就可以通过ssh或者putty这样的软件连接到你的手机上,要命的是所有资料都能获取到。
越狱 ≈ 你离艳照门不远了

解决办法:
一、通过专门的root密码修改软件来修改
二、通过ssh或者putty连接登陆上自己的iphone/ipad修改

#执行命令
passwd root
#然后输入两次新密码

scons简介,scons安装,scons使用

scons是一个Python写的自动化构建工具,从构建这个角度说,它跟GNU make是同一类的工具。它是一种改进,并跨平台的gnu make替代工具,其集成功能类似于autoconf/automake 。scons是一个更简便,更可靠,更高效的编译软件。

SCons是一个基于Python的软件构件工具,其优势在于:
构建是基于真正的Python脚本实现的,可以解决各种复杂的构建问题;
可靠的自动依赖分析;
内置支持多种语言,内置Tex文档,并且易于扩展;
增强了并行构建;
集成了类似autoconf的支持;
支持在缓存中共享构建过程中的中间文件以提高速度;
跨平台;
基于MD5识别构建文件的改变;
支持多种源码管理仓库。

scons安装

wget http://jaist.dl.sourceforge.net/project/scons/scons/2.3.0/scons-2.3.0.tar.gz
tar zxvf scons-2.3.0.tar.gz
cd scons-2.3.0
python setup.py install

简单使用:
比如安装serf

scons APR=/usr/local/apr APU=/usr/local/apr-util OPENSSL=/usr PREFIX=/usr/local/serf
scons check
scons install

linux编译找不到apr,安装apr编译环境,编译需要apr的解决方案,apr-util安装方法,安装svn需要apr

linux很多地方编译的时候都会用到apr
如果找不到apr就会报错

configure: WARNING: APR not found
The Apache Portable Runtime (APR) library cannot be found.
Please install APR on this system and configure Subversion
with the appropriate –with-apr option.

You probably need to do something similar with the Apache
Portable Runtime Utility (APRUTIL) library and then configure
Subversion with both the –with-apr and –with-apr-util options.

apr是比较恶心的一个东东,因为用直接用yum install apr安装apr后,当再安装其他东西需要apr环境时候 经常还是找不到,尽管已经安装它了。

这样的话我们只能通过下面这两个参数来指定他们的位置了,但是首先要做的就是安装apr和apr-until

--with-apr
--with-apr-util

apr 和 apr-util官网下载地址:
http://apr.apache.org/download.cgi
安装顺序是先安装apr然后再安装 apr-util,因为安装apr-util需要apr环境
首先安装apr 指定安装到/usr/local/apr

wget http://mirrors.cnnic.cn/apache/apr/apr-1.4.8.tar.gz
tar zxvf apr-1.4.8.tar.gz
cd apr-1.4.8
./configure --prefix=/usr/local/apr
make & make install

然后安装apr-util,指定安装到/usr/local/apr-util

wget http://mirrors.cnnic.cn/apache/apr/apr-util-1.5.2.tar.gz
tar zxvf apr-util-1.5.2.tar.gz
cd apr-util-1.5.2
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
make & make install

经过上面的步骤我们就可以安装其他程序了,比如编译安装svn的时候指定apr和apr-util
指定svn位置/usr/local/subversion 同时也要指定apr和apr-util位置,代码如下

wget http://mirror.esocc.com/apache/subversion/subversion-1.8.3.tar.gz
cd subversion-1.8.3.tar.gz
./configure --prefix=/usr/local/subversion --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util
make & make install

shell定时检测mysqld服务启动,检测nginx,httpd服务是否正常运行

前几天发现网站打不开,提示数据库连接错误,我登录linux 发现mysqld服务不知道什么时候停止了。幸好我即使发现。
于是决定写一个shell脚本每分钟自动检测mysqld服务,如果发现服务没起来就自动启动mysqld服务
也就是:通过cron定时任务执行检测脚本

编写检测脚本 /root/bin/check

#!/bin/bash

check=`pgrep mysql`

if [ -n "$check" ]; then
        exit
else
        date=$(date +"%Y-%m-%d %H:%M:%S")
        /etc/init.d/mysqld  start
        echo 'error: mysqld at ' $date
fi

说明:也可以修改check=`pgrep mysql` 比如 check=`pgrep httpd` 或者 check=`pgrep nginx`来监测其他服务

编辑cron执行

crontab -e

cron内容如下,其中注释掉了一行,可选择性编写

#* * * * * sh /root/bin/check > /dev/null 2>&1 #执行后不发送结果邮件
* * * * * sh /root/bin/check >> /root/bin/log.txt #执行后发送结果到指定文件

由于cron每次执行后如果有输出则会默认发送邮件到 /var/spool/mail/root 长时间会导致 此文件有很多无用记录
我们可以用 > /dev/null 2>&1 忽略结果写入
当然也可以用 >> /root/bin/log.txt 写入到指定文件(要事先建立好文件)

符:
cron命令行简要说明
分 时 日 月 星期 命令行
例: */5 * * * * cmd #表示每5分钟执行一次命令

command > filename 把标准输出重定向到一个新文件中
command >> filename 把标准输出重定向到一个文件中(追加)
command 1 > fielname 把标准输出重定向到一个文件中
command > filename 2>&1 把标准输出和标准错误一起重定向到一个文件中
command 2 > filename 把标准错误重定向到一个文件中
command 2 >> filename 把标准输出重定向到一个文件中(追加)
command >> filename 2>&1 把标准输出和标准错误一起重定向到一个文件中(追加)
command < filename >filename2 把command命令以filename文件作为标准输入,以filename2文件作为标准输出
command < filename 把command命令以filename文件作为标准输入
command << delimiter 把从标准输入中读入,直至遇到delimiter分界符
command <&m 把文件描述符m作为标准输入
command >&m 把标准输出重定向到文件描述符m中
command <&- 把关闭标准输入
command 2>&1 把command命令标准错误重定向到标准输出