引言

我们放在GIT库的项目,遇到pull或者push等操作的时候,经常需要输密码

git-shh-1

这未免太过繁琐,而配置SHH链接可以免除这样的烦恼,可谓不可不配,过程也非常的简单,几个命令即可
开源中国和Github的配置方式其实都是一样的,没什么区别,这里以开源中国为例

环境

首先你必须要有一个可以运行git命令的工具

  1. android studio自带的Terminal
  2. windows下的Git Bash
  3. 其他能响应Git命令的命令行
    Git For Windows2.7.2 - 29.4MB

检查本机ssh key

先看下你本机的ssh key有没有

$ cd ~/.ssh 如果没有则提示: No such file or directory 如果有则会进入~/.ssh路径下

如果存在即可以用rm命令删除掉,我们重新生成一个
ls #查看当前路径文件 rm * #删除所有文件

生成本地shh key

切回去根目录(~)
`$ cd ~

#保证当前路径在”~”下
`

生成rsa-key
`$ ssh-keygen -t rsa -C “xxxxxx@yy.com”

#建议填写自己真实有效的邮箱地址

#操作结果:
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/xxxx_000/.ssh/id_rsa):

#不填直接回车
Enter passphrase (empty for no passphrase):

#输入密码(可以为空,建议为空)
Enter same passphrase again:

#再次确认密码(可以为空,建议为空)
Your identification has been saved in /c/Users/xxxx_000/.ssh/id_rsa. #生成的密钥
Your public key has been saved in /c/Users/xxxx_000/.ssh/id_rsa.pub. #生成的公钥
The key fingerprint is:
e3:51:33:xx:xx:xx:xx:xxx:61:28:83:e2:81 xxxxxx@yy.com
`

*本机已完成ssh key设置,其存放路径为:c:/Users/xxxx_000/.ssh/下。
注释:可生成ssh key自定义名称的密钥,默认id_rsa。
$ ssh-keygen -t rsa -C “邮箱地址” -f ~/.ssh/githug_blog_keys #生成ssh key的名称为githug_blog_keys,慎用容易出现其它异常。

git-shh-2

到网站上添加这个key

打开刚刚生成的id_rsa.pub,复制所有内容,到git.oschina.net,个人设置,SSH公钥中,粘贴进去
$ cd .ssh #切换到.ssh目录下 start . #用文件管理器打开当前目录

配置账户

$ git config --global user.name “your_username” #设置用户名 $ git config --global user.email “your_Email” #设置邮箱地址

测试ssh keys

`#开源中国
$ ssh -T git@git.oschina.net

#github
$ ssh -T git@github.com

#操作结果:
The authenticity of host ‘xxxxxxxx (xxxxx)’ can’t be established.
RSA key fingerprint is 16:27:xx:xx:xx:xx:xx:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)? yes

#确认你是否继续联系,输入yes,回车
Warning: Permanently added ‘xxxxxx’ (RSA) to the list of known hosts.
Enter passphrase for key ‘/c/Users/xxxx/.ssh/id_rsa’:

#生成ssh kye是密码为空则无此项,若设置有密码则有此项且,输入生成ssh key时设置的密码即可。
Hi xxx!

#出现词句话,说明设置成功。
`

git-shh-3

至此,SSH KEYS 配置完成,然后就是使用 SSH URL 来导出项目,这个属于GIT就不多讲了

但是还要补充一个,就是之前的项目使用的是https,是不会自动使用ssh key的,如何切换到现在的ssh方式呢?

切换分支URL为ssh方式

使用 git remote 命令

git remote set-url origin 你的项目ssh地址

Complete ,Have A Nice Day!

在实际开发中,经常会需要需要在ScrollView下,嵌套一个ViewPager,整体可以上下滑动。ViewPager中是一些Fragment,可以进行左右滑动切换。Fragment中嵌套ListView,实现数据的列表显示,同理也是随着整个ScrollView上下滑动。效果图如下:

QQ图片20160111095955 QQ图片20160111100401

 

 

首先要解决的就是scrollview下viewpager大小自适应的问题

最有效的方法肯定是 自定义一个viewpager并重写它的onMeasure方法

相关注释如下,如果有不对的请指正

`
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

    //如果 ViewPager 的上层是 ScrollView
    //按照viewpager的高度,决定父元素scrollview的高度
    if(viewInScrollView) {
        int height = 0;
        for (int i = 0; i < getChildCount(); i++) {
            View child = getChildAt(i);
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            int h = child.getMeasuredHeight();
            if (h > height)
                height = h;
        }

        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
    }

    //如果 ViewPager 的下层有 ListView
    //遍历所有子View,设置每个子View的大小,并找出高度最大的listview,设置为父元素viewpager的高度
    if(viewWithListView) {
        int maxHeight = 0;
        for (int i = 0; i < getChildCount(); i++) {
            View child = getChildAt(i);
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            if (child.getMeasuredHeight() > maxHeight) {
                maxHeight = child.getMeasuredHeight();
            }
        }

        if (maxHeight > 0) {
            setMeasuredDimension(getMeasuredWidth(), maxHeight);
        }
    }

    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

`

代码中用到了两个变量

private boolean viewInScrollView = false; private boolean viewWithListView = false;

默认为false,根据需要去set它们就好了

holydancer原创,如需转载,请在显要位置注明:

转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details/9219333

 

概述:

苹果的证书繁锁复杂,制作管理相当麻烦,今天决定重置一个游戏项目中的所有证书,做了这么多次还是感觉很纠结,索性直接记录下来,日后你我他查阅都方便;

首先得描述一下各个证书的定位,作用,这样在制作的时候心中有谱,对整个流程的把握也会准确一些;

1、开发者证书(分为开发和发布两种,类型为ios Development,ios Distribution),这个是最基础的,不论是真机调试,还是上传到appstore都是需要的,是一个基证书,用来证明自己开发者身份的;

2、appID,这是每一个应用的独立标识,在设置项中可以配置该应用的权限,比如是否用到了PassBook,GameCenter,以及更常见的push服务,如果选中了push服务,那么就可以创建生成下面第3条所提到的推送证书,所以,在所有和推送相关的配置中,首先要做的就是先开通支持推送服务的appID;

3、推送证书(分为开发和发布两种,类型分别为APNs Development ios,APNs Distribution ios),该证书在appID配置中创建生成,和开发者证书一样,安装到开发电脑上;

4、Provisioning Profiles,这个东西是很有苹果特色的一个东西,我一般称之为PP文件,该文件将appID,开发者证书,硬件Device绑定到一块儿,在开发者中心配置好后可以添加到Xcode上,也可以直接在Xcode上连接开发者中心生成,真机调试时需要在PP文件中添加真机的udid;是真机调试和必架必备之珍品;

平常我们的制作流程一般都是按以上序列进行,先利用开发者帐号登陆开发者中心,创建开发者证书,appID,在appID中开通推送服务,在开通推送服务的选项下面创建推送证书(服务器端的推送证书见下文),之后在PP文件中绑定所有的证书id,添加调试真机等;

具体操作流程如下:

1、开发者证书的制作,首先登陆到开发者中心,找到证书配置的版块,猛戳进入,点进证书,会显示如下界面,点击右上角的加号

会出现以下界面,该操作重复两次,分别创建开发测试证书和发布证书,开发测试证书用于真机调试,发布证书用于提交到appStore,我们

以开发测试证书为例,选择第一个红框中的内容;
然后下一步,会提示创建CSR文件,也就是证书签名请求文件,会有很详细的操作说明,如果英文不太好,可以参考下图;在程序面板中搜索打开钥匙串访问

之后将该CSR文件保存到一处;

备注:CSR文件尽量每个证书都制作一次,将常用名称区分开来,因为该常用名称是证书中的密钥的名字;

之后在开发者中心将该CSR文件提交;

提交上去后就会生成一个cer证书,如图所示,有效期为一年;

利用同样的方法配置一下Distribution发布证书,下载保存,双击安装;在钥题串登陆证书中可以查看,其中专用密钥的名字即为CSR请求文件中的常用名称;

2、以上开发者证书的配置完成了,下面我们来配置appID和推送证书;在左边栏中选择appID,勾选右边的push可选项,为该appID所对应的应用添加推送功能,下面会看到创建证书的按钮,分别为开发证书和发布证书,下面的流程就和上述1中创建证书一样了,都是先建立证书请求文件,然后提交生成就行了,需要注意的是,虽然在左边栏证书栏中也可以直接创建推送证书,但是还是建议在appID中,勾选了push服务后在此处创建,这样会避免因为忘了开通push服务而导致推送不可用的情况发生;

证书创建完成后,下载保存,双击安装即可;

3、最后我们来进行PP文件的制作

该流程进行两次,分别创建开发测试用PP文件和发布PP文件,前者用于真机测试,后者用于提交发布;Ad Hoc格式一般用于企业帐号,此处我们忽略;

选择后提交

会自动检测匹配appID,另外下拉项中还可以选择wildCard格式,该格式为自动生成,使用*通配符,适用于批量的,没有推送,PassCard等服务的应用;我们选择我们刚刚创建的appID,之后下一步选择证书;

继续,这里有一个区别,因为PP文件的开发测试版需要真机调试,所以我们需要绑定真机,这里因为之前我添加过一些设备,所以这里就可以直接全选添加,如果没有的话,需要将真机的udid复制出来在此添加,在发布PP文件中,是没有这一步的;

之后就是输入一个PP文件的名字了,然后生成,下载保存,双击添加到Xcode库中,这样在真机调试或者发布时,就可以分别有不同的PP文件与其对应;

添加到Xcode中的效果如下:

到目前为止,客户端开发和上架所需要的证书文件配置都已经配齐了,天色已晚,明天再配置服务端所用到的推送证书吧,到时候另起一章,将ios诡异的推送流程也捋一捋,本来想写到一篇里的,没想到整了这么长,下班回家开黑去喽!

首先在使用ADB前所有手机辅助类软件

1、CMD命令窗口输入:adb nodaemon server 。然后就会提示你哪个端口被占用了。

2、输入netstat -ano | findstr “5037” 。然后会弹出提示告诉你哪些进程占用了该端口,记住非0地址的后面的数字

3、打开任务管理器,点击“进程“,“查看”-“选择列”,勾选PID

4、查找第2步中看到的数字PID,然后结束相关进程,即可

CrossWalk 是什么?它是一个基于 Chromium 的浏览器组件,用来取代 Android4.x 中的 WebView 。

它的优势

1 大幅度提升 Web 程序性能

2 支持最新的 HTML5 特性

3 解决不同设备的兼容性问题
支持最新的HTML5 API,提升页面的滑动流畅度,对页面的加载及渲染非常好。【目前明显体现出来的,针对Android下面的页面加载很好】

 

它的缺点:

1 不支持 iOS ,也不支持 Android4.0 以下的版本

2 打包后的 apk 文件将增加近20M
只支持Android系统(ios其实不需要,ios下面效果很不错的),Crosswalk仅支持Android4.0+,打包后apk大小增加10几M,对phonegap的一些插件支持度不好【目前我没有发现,有人这么说】。

 

可以根据实际情况决定是否使用。

下面介绍如何将CrossWalk整合到一个普通的PhoneGap应用中。

 

废话很多了。开始集成。

一、下载适配 PhoneGap/Cordova 的 CrossWalk SDK 。

下载地址:地址1 地址2

如果手机 CPU 是 Intel 平台请下载 Cordova Android(x86) ,其他请下载 Cordova Android(ARM) 。

二、将下载的SDK解压到硬盘,并将其中的 framework 文件夹导入 Eclipse 中。

在 Eclipse 的项目列表中将会出现:

framework

xwalk_core_library
提示:如果有一个styles.xml文件报错,可以将该文件删除,不会有影响。

三、修改项目依赖

在你的 PhoneGap 项目上点击右键->属性(property),在弹出的窗口中切换到 Android 标签页,找到下方的 Library 区域。

配置为如下:

CordovaLib

xwalk_core_library
添加到列表中,点击确定。

四、为 PhoneGap 项目添加下面的权限:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

五、按下面的顺序依次 build 项目:

xwalk_core_library

cordovalib

your application project
提示:如何 build 项目?选中项目,点击右键并选择build pro ject。

整合完成,再次打包 App ,你会发现 CrossWalk 已经整合到 App 中。

六、完成

你会发现特别长的文章内容及页面滑动会变的非常流畅。

收集一下phonegap路上的坑和坎


(ng-if)等组件或指令本身会产生子scope,会继承重写页面scope。

解决1:需要在controller中定义一个对象,使用对象的属性,才能进行跨scope数据传递。

解决2:通过$parent访问上层scope

phonegap 打包APP后无网络 404 错误

1,检查是否有cordova-plugin-whitelist插件
ionic plugin list
2,如果有,检查config.xml是否有access配置,一般配置为就行了
<access origin=”
“/>
3,如果没有cordova-plugin-whitelist插件,安装它
cordova plugin add cordova-plugin-whitelist
4,然后配置access网络白名单

分离Controller需要注意

var myApp = angular.module(‘myApp’,[]);
会创建一个Module,如果分controllers.js分件,只有第一个加载的js文件中需要创建,后面的不需要再次创建,否则会丢失上一个加载的module。
var myApp = angular.module(‘myApp’);
不会创建新的module对象

问:angular-ui-router,$state.go如何带参数?

1.在App.js的状态机定义中,添加params项,写上要传递的参数名和默认值
//用户中心 我的订单
.state('tab.user-myOrders', { url: '/user/myOrders', views: { 'tab-usercenter': { templateUrl: 'templates/user/myOrders.html', controller: 'UserOrderCtrl', }, }, params: {param:0} })
2.在$state.go函数中添加要传递的参数值
$state.go(“tab.user-myOrders”,{param:288});
3.在新页面的controller中,定义$stateParams,获取参数
$stateParams.param;

 

好消息,新主题WP-dls正式上线啦! 细节还在完善中,自我感觉挺好的~,最大的特色就是全站Ajax无刷新加载,音乐无中断。感觉美美哒,加油!
  • 关于博客

我本为追回自身的青春活力而出游,而一落笔却比过去写的任何文章都显得苍老。
我写博客,不为何,只为了心中那一丝丝萌动。* 关于博主

我从事IT技术研发运营工作,就是每天撰写英文那种,心情好的时候也会加点中文翻译,说白了就是“程序猿”;

单身男、爱好女:同性可选择仰慕、崇拜或暗恋,但请不要做出无谓的牺牲,我的立场很坚定;

为何写博客:代码敲的累了,换个中文悠闲悠闲,但请不要以为我是闲的蛋疼;

我是好人,但好人也是人!* 背景

:smile:回复有福利哦~
gril<

主题下载地址:

WPdls主题2015年6月29日 - 1.43MB;)

 

世界你好!HelloWorld!

 

一、新手入门

集成开发工具 :WebStorm 8.0.3 下载地址

Angular JS :1.4.1 中文官网

1、AngularJs的安装

具体安装就不多叙述了,建议先到Node.js下载并安装到本地,添加到path中,使在CMD中可以正常使用npm命令,通过npm install angular安装。或者直接到上文给出的官网下载js包亦可。

2、HelloWorld

开始学习AngularJS的一个好方法是创建经典应用程序“Hello World!”:

  1. 使用您喜爱的文本编辑器,创建一个HTML文件,例如:helloworld.html。
  2. 将下面的源代码复制到您的HTML文件。
  3. 在web浏览器中打开这个HTML文件。
    <!doctype html>
    <html ng-app>
    <head>
    <script src="../angular.min.js"></script>
    </head>
    <body>
    Hello {  { 'World' } }!
    </body>
    </html>

3、详解

现在让我们仔细看看代码,看看到底怎么回事。

当加载该页时,标记ng-app告诉AngularJS处理整个HTML页并引导应用:

<html ng-app>
这行载入AngularJS脚本:
<script src="../angular-1.0.1.min.js"></script>
最后,标签中的正文是应用的模板,在UI中显示我们的问候语:
Hello  { {'World' } }!
注意,使用双大括号标记的内容是问候语中绑定的表达式,这个表达式是一个简单的字符串‘World’。   下面,让我们看一个更有趣的例子:使用AngularJS对我们的问候语文本绑定一个动态表达式。 ## ## 二、Hello AngularJS World! ### 1、双向数据绑定 本示例演示AngularJS的双向数据绑定(bi-directional data binding):  
<!doctype html>
<html ng-app>
<head>
    <script src="../angular.min.js"></script>
</head>
<body>
Your name: <input type="text" ng-model="yourname" placeholder="World">
<hr>
Hello  { { yourname || 'World' } } !
</body>
</html>

2、详解

该示例有一下几点重要的注意事项:

  • 文本输入指令&lt;input ng-model="yourname" /&gt;绑定到一个叫yourname的模型变量。
  • 双大括号标记将yourname模型变量添加到问候语文本。
  • 你不需要为该应用另外注册一个事件侦听器或添加事件处理程序!
    现在试着在输入框中键入您的名称,您键入的名称将立即更新显示在问候语中。 这就是AngularJS双向数据绑定的概念。 输入框的任何更改会立即反映到模型变量(一个方向),模型变量的任何更改都会立即反映到问候语文本中(另一方向)。

 

 

三、AngularJS应用的解析

本节描述AngularJS应用程序的三个组成部分,并解释它们如何映射到模型-视图-控制器设计模式:

1、模板(Templates)

模板是您用HTML和CSS编写的文件,展现应用的视图。 您可给HTML添加新的元素、属性标记,作为AngularJS编译器的指令。 AngularJS编译器是完全可扩展的,这意味着通过AngularJS您可以在HTML中构建您自己的HTML标记!

2、应用程序逻辑(Logic)和行为(Behavior)

应用程序逻辑和行为是您用JavaScript定义的控制器。AngularJS与标准AJAX应用程序不同,您不需要另外编写侦听器或DOM控制器,因为它们已经内置到AngularJS中了。这些功能使您的应用程序逻辑很容易编写、测试、维护和理解。

3、模型数据(Data)

模型是从AngularJS作用域对象的属性引申的。模型中的数据可能是Javascript对象、数组或基本类型,这都不重要,重要的是,他们都属于AngularJS作用域对象。

AngularJS通过作用域来保持数据模型与视图界面UI的双向同步。一旦模型状态发生改变,AngularJS会立即刷新反映在视图界面中,反之亦然。

4、PS

此外,AngularJS还提供了一些非常有用的服务特性:

  1. 底层服务包括依赖注入,XHR、缓存、URL路由和浏览器抽象服务。
  2. 您还可以扩展和添加自己特定的应用服务。
  3. 这些服务可以让您非常方便的编写WEB应用。
     

四、备注

文章大体转载自“图灵社区”,所有例子都在小树最新版本下调试运行通过并修正部分代码解释后发布的,特此说明,不定期更新。

為什麼油站總是建在另一家旁呢?

為什麼會走了一里路也找不到一家咖啡店,卻在一個角落找到三家呢?

為什麼便利店、餐廳等總是一群一群的出現,而非在社區中平均分佈呢?

 

 
縱使在選擇開店位置時有眾多考量,一個很簡單的故事便能解釋以上現象:

 
「霍特林的空間競爭模型」

 
(Hotelling’s Model of Spacial Competition)

請想像你在一個沙灘裡賣雪糕,

沙灘長一里,而且你並沒有競爭(沒有其他雪糕車),

你在哪裡擺放雪糕車才能夠賣出最多雪糕呢?

中間

雖然對在沙灘兩邊盡頭的人來說可能太遠了(要走½里路),但你的雪糕車所能惠顧的人是最多的。

有一天, 你去賣雪糕的時候發現你的堂兄Teddy也來了。

Teddy也推著雪糕車,竟然跟你賣一模一樣的雪糕!
你們協議了各人得到沙灘的一半,

為了方便顧客,讓他們少走,

你在沙灘中央的往下¼里處設店,正在你地盤的中央;

而Teddy則在沙灘中央的往上¼里處設店,正在他地盤的中央。

由此,所有在你店南方的人都往你店買雪糕,

所有在Teddy北方的人都往他店買雪糕,

而在中央的顧客則往最近的店走,從而平分,各得50%。

沒有人需要走多於¼里便有雪糕吃,而各店也得到沙灘50%的顧客

這是對社會最好的結果

它使顧客要走的路最少化。

第二天,你推著雪糕車到沙灘,卻發現Teddy把雪糕車置於沙灘正中央了!

你回到你以往的¼里處,得到南方25%的顧客。

而Teddy不但還有本來北方的顧客,更與你平分你們之間(本來屬於你)的顧客!

憤憤不平的你第三天特早到沙灘,在Teddy北面的地盤正中開店,期望得到你南方的75%顧客;而Teddy只得其餘25%。

可惜如意算盤打不響… Teddy輕鬆的在你南面設店,搶奪了所有在南面的顧客,而你只得上方少量的顧客。

氣了,你把雪糕車推到Teddy南方10步,從而重奪你的顧客。

你中午休息時,Teddy又次遷移至你南方10步,又奪取南方所有的顧客了!

你們整天就在你追我趕,不斷向南移吸納顧客。

最終,你們倆便停在沙灘的中央了,背對背,各自服務自己一方50%的顧客。

這時,你們達到了納西平衡(Nash Equilibrium) ——你們倆都沒辦法通過移動位置而獲得更高利益。

你們本來各分沙灘一半的方案失敗了,正是因為那不是納西平衡:你們都可以往中間移動而獲得更多顧客。

而現在你們倆都在沙灘中央,你們不可能在不流失顧客的情況下移位

然而,這不再是對社會最好的結果了

因為在沙灘盡頭的顧客要走不必要遠的路。

現在想想商場裡的所有連鎖式快餐店(題主的麥當勞與肯德基)、服裝店、手機專門店…

雖然若各類型店鋪平均分佈,顧客會獲得更好的服務,但這卻導致激烈的競爭。

在真實世界,顧客是來自於對於一方的,而且商舖也有市場策略,如產品多樣化、促銷等。但在這些策略的核心,商店還是著重於保持競爭力。

一、引言

恰逢公司的项目需要用到定时器,在网上搜了许多的资料,虽说PHP本身是无状态的语言,用来做定时器非常的麻烦和耗资源,但是实际应用上还是少不了的。方法有几个:

1,利用计算机系统本身的计划任务

2,利用js前台刷新页面定时访问PHP文件

3,利用PHP死循环长连接
由于1,2两种办法都没办法很好地对定时器进行很好的控制,而本篇主要讲的是可控制的定时器,因此我们来详看第三种方法。

二、思路

思路其实不复杂,利用 while(true)死循环让PHP脚本一直处于执行的状态。但是!要注意的是,PHP本身是有一个机制会中断无响应的脚本的,因此,我们要加上。

ignore_user_abort(false);//当用户关闭页面时服务停止
set_time_limit(0); //设置执行时间,单位是秒。0表示不限制。

先给出一个基本的范式,其中有个人的测试程序:

<?php
ignore_user_abort(); // run script. in background
set_time_limit(0); // run script. forever
$interval=30; // do every 15 minutes…
do{
$fp = fopen(‘text3.txt’,’a’);
fwrite($fp,’test’);
fclose($fp);
sleep($interval); // wait 15 minutes
}while(true);
?>

 

首先运行该程序,然后关闭该页面,程序仍然运行中,test会每隔30秒的填补到text3.txt文件。

至此一个简单的定时器算是OK了,但是它是不可控制的,因为程序处于死循环中,是无法接受外界的数据的。

那么我们要实现可控制,怎么办呢?解决办法是有的,这里很多种办法,比如读数据库,读文件,我带来的方法也简单,就是用PHP本身的INCLUDE,这样效率也不会太低,消耗的资源也不会太过于大!

即:在死循环中,加一个 if();,判断的条件,就是 $flag = include ‘路径/配置文件.php’;

而这个 [配置文件.php] 的内容很简单,就一句:<?php return true; ?>

当你需要这个定时器停下来的时候,用文件函数fopen打开这个配置文件,然后替换true为false就可以了,这就是基本的思路!

三、源码例子

 

<?php

ignore_user_abort (); // 即使Client断开(如关掉浏览器),PHP脚本也可以继续执行.
set_time_limit ( 0 ); // 执行时间为无限制,php默认的执行时间是30秒,通过set_time_limit(0)可以让程序无限制的执行下去

class money extends admin {

public $timer_switch;            //定时器-开关-文件
public $timer_h;                //定时器-时-文件
public $timer_m;                //定时器-分-文件
public $timer_delay;            //定时器-间隔时间(秒)-文件
public $timer_value;            //利息利率

public function __construct(){
    parent::__construct();
    $this-&gt;db = System::load_sys_class("model");
    $this-&gt;timer_switch = dirname(__FILE__)."\\timer_switch.php";
    $this-&gt;timer_h = dirname(__FILE__)."\\timer_h.php";
    $this-&gt;timer_m = dirname(__FILE__)."\\timer_m.php";
    $this-&gt;timer_delay = dirname(__FILE__)."\\timer_delay.php";
    $this-&gt;timer_value = dirname(__FILE__)."\\timer_value.php";
}

public function index(){
    if(isset($_POST['submit'])){
        $this-&gt;h($_POST['h']);
        $this-&gt;m($_POST['m']);
        $this-&gt;delay($_POST['delay']);
        $this-&gt;value($_POST['value']);
        $msg = '【保存成功】';
    }
    $switch = include $this-&gt;timer_switch;
    $h = include $this-&gt;timer_h;
    $m = include $this-&gt;timer_m;
    $delay = include $this-&gt;timer_delay;
    $value = include $this-&gt;timer_value;
    include $this-&gt;tpl(ROUTE_M,'money_index');
}

public function h($s){
    $string = '&lt;?php return "'.$s.'";?&gt;';
    write_inc($this-&gt;timer_h,$string,true);
}

public function m($s){
    $string = '&lt;?php return "'.$s.'";?&gt;';
    write_inc($this-&gt;timer_m,$string,true);
}

public function delay($s){
    $string = '&lt;?php return "'.$s.'";?&gt;';
    write_inc($this-&gt;timer_delay,$string,true);
}

public function value($s){
    $string = '&lt;?php return "'.$s.'";?&gt;';
    write_inc($this-&gt;timer_value,$string,true);
}

public function stop(){
    $string = '&lt;?php return "stop";?&gt;';
    write_inc($this-&gt;timer_switch,$string,true);
    $this-&gt;index();
}

public function start(){
    //必须为暂停状态才可以开始
    $timer_switch = include $this-&gt;timer_switch;
    if($timer_switch!='stop'){
        $fp = fopen('c:/func.txt','a');
        fwrite($fp,date("Y-m-d TH:i:s Z").".结束定时器.\r\n");
        fclose($fp);
        die();
    }else{
        $fp = fopen('c:/func.txt','a');
        fwrite($fp,date("Y-m-d TH:i:s Z").".启动定时器.\r\n");
        fclose($fp);
        $string = '&lt;?php return "start";?&gt;';
        write_inc($this-&gt;timer_switch,$string,true);
    }
    //进入定时器
    do{
        $timer_switch = include $this-&gt;timer_switch;
        $timer_h = include $this-&gt;timer_h;
        $timer_m = include $this-&gt;timer_m;
        $timer_delay = include $this-&gt;timer_delay;
        $h = intval(date("H"));
        $m = intval(date("i"));
        //判断时间
        if ($h ==$timer_h &amp;&amp; $m == $timer_m) {
            $fp = fopen('c:/func.txt','a');
            fwrite($fp,date("Y-m-d TH:i:s Z").".执行任务了.\r\n");
            fclose($fp);
            $this-&gt;calc();
        } else {
            $fp = fopen('c:/func.txt','a');
            fwrite($fp,date("Y-m-d TH:i:s Z").".距离执行时间还有".((($timer_h-$h)%24)*60+($timer_m-$m)%60)."分钟.\r\n");
            fclose($fp);
        }
        //延迟
        sleep($timer_delay);
        //判断是否关闭
        if($timer_switch=="stop"){
            $fp = fopen('c:/func.txt','a');
            fwrite($fp,date("Y-m-d TH:i:s Z").".终止.\r\n");
            fclose($fp);
            $this-&gt;ing_off();
            die();
        }
    }while(true);

}

public function calc(){

}

}

function write_inc($path,$strings,$type=false){
    if ($type==false)
        file_put_contents($path,$strings,FILE_APPEND);
    else
        file_put_contents($path,$strings);
}

?>