Docker + PHPComposer + Gitlab

为了方便今后的编译部署,直接使用Docker来进行服务管理

 

 

准备工作

yum install docker

yum install python-pip

如果没有python-pip包就执行命令

yum -y install epel-release

完成安装后再次执行

yum install python-pip

pip install docker-compose

——–PS: 执行安装后,报如下错误 ———-

Exception: Traceback (most recent call last): File “/usr/lib/python2.7/site-packages/pip/basecommand.py”, line 215, in main status = self.run(options, args) File “/usr/lib/python2.7/site-packages/pip/commands/install.py”, line 307, in run requirement_set.prepare_files(finder) File “/usr/lib/python2.7/site-packages/pip/req/req_set.py”, line 370, in prepare_files ignore_dependencies=self.ignore_dependencies)) File “/usr/lib/python2.7/site-packages/pip/req/req_set.py”, line 587, in _prepare_file session=self.session, hashes=hashes)

执行

pip install --upgrade backports.ssl_match_hostname 
pip install docker-compose

检查是否已经正确安装

docker --version
docker-compose --version

到此,准备工作已完成。 将一下内容存储为 docker-compose.yml 文件

并执行: docker-composer up 如果安装过程无误,到此安装结束。

PS: 将服务推送至后台
docker-composer up -d
脚本中的  volumes 根据需求做出调整即可

快递安装方法

wget http://www.debuglee.com/docker/Docker_PHPComposer_Gitlab/docker-compose.yml

docker-compose up

访问地址

Gitlab
80 http://localhost:10080

composer
80端口 http://localhost:10081
443端口 http://localhost:10082

管理地址: http://localhost:10081
默认用户名 admin
默认密码 foo

产品中非常重要的 Alpha版本

bug
软件是否能够按计划发版本,除了严格执行计划外,版本控制必不可缺。
发版本能干什么?
  1. 治疗拖延症
  2. 发现软件中的bug
  3. 确保质量准确跟踪
     项目如果经常遇到不能按时发布版本,排除计划做得不周详外,这里只讨论人的问题,很多个程序员都会有的病症“拖延症”,不到上线前一天不加班,不到上线前最后一晚不发版本,版本发完了,一堆bug 重复,周而复始,产品的进度,质量最终无法保证,团队努力付之东流。
现实场景:
 bug2
A小组 每天都很努力, bate 版本发布前一天,通宵加班,发布版本。 第二天,测试如期收到了测试版本1.0 。
测试如期完成测试任务,测试发布了一份非常详细的测试报告。 结案陈词: 一万个草尼玛奔腾而过。
大大小小的bug不计其数,各种撕逼大会后,给出了一份修复时间表,继续修复 ,修复一周后,继续 一万个草尼玛奔腾而过。
开发的过程中,开发时间是足够的,但是拖延症的作祟会让每次版本发布得非常仓促,
加上程序员的技术水平,责任心,会让这个过程变成了一个死循环,拖延了正式版本的发布时间。延期再延期。
治疗圣药,发布Alpha版,内部测试版,每日构建。进行每日构建可以看得到每日的开发进度,这个构建时间并不一定是一天,
但是这个周期最长建议不超过3天。
每日构建,可以可以让产品经理,技术经理等相关人员了解到产品的进度,同时也治疗了拖延症,程序员每日每日是否完成指定计划有了一个明显的度量标准,最起码,你看得见产品今天有了什么变化,看得见戳得着。
如果加上svn 或者git的跟踪,每天写多少行,改了哪些行,敲了多少字,都可统计。
在一个创业团队当中,很多很多时候,产品,开发,测试,客服 等等角色都是一个人在担任,你很难让每一个员工都有主人翁精神,
简单,粗暴,见效快的方式是就是每天构建版本,让问题当天就能呈现,有了这些统计数据你可以做更多的事情。

Confide Laravel 用户认证扩展包

屏幕快照 2014-09-10 下午11.38.13

Confide Laravel 用户扩张包,试了一下非常强大,安装配置起来也非常迅速

安装的操作步骤和大致的wen

项目地址:https://github.com/zizaco/confide

功能

Account confirmation (through confirmation link).
账号确认,通过点击确认连接

Password reset (sending email with a change password link).
密码重置,通过电子邮件发送密码修改连接

Easily render forms for login, signup and password reset.
简单快速生成 登陆,注册,密码重设表单

Generate routes for login, signup, password reset, confirmation, etc.
为登陆,注册,密码重置,确认等生成路径

Generate a customizable controller that handles the basic user account actions.
生成一个具有基础账户功能的自定义的控制器

Contains a set of methods to help with basic user features.
没搞明白(求大神帮助)

Integrated with the Laravel Auth and Reminders component/configs.
没搞明白(求大神帮助)

User validation.
用户验证

Login throttling.
登陆方式

Redirecting to previous route after authentication.
重定向到验证页面

Checks for unique email and username in signup
检查邮件与用户名是否唯一

安装

修改 composer.json 文件

增加配置信息
“zizaco/confide”: “~4.0@dev”

执行 Composer update 命令
composer update

修改 config/app.php 添加 ‘Zizaco\Confide\ServiceProvider’ 到 providers 数组中

‘providers’ => array(

‘Illuminate\Foundation\Providers\ArtisanServiceProvider’,
‘Illuminate\Auth\AuthServiceProvider’,

‘Zizaco\Confide\ServiceProvider’,

),

修改 config/app.php 添加 ‘Confide’ => ‘Zizaco\Confide\Facade’ 到 aliases 数组中

‘aliases’ => array(

‘App’        => ‘Illuminate\Support\Facades\App’,
‘Artisan’    => ‘Illuminate\Support\Facades\Artisan’,

‘Confide’    => ‘Zizaco\Confide\Facade’,

),

配置
Set the properly values to the config/auth.php. This values will be used by confide to generate the database migration and to generate controllers and routes.
配置 config/auth.php
将 ‘driver’ => ‘eloquent’, 修改为 ‘driver’ => ‘database’,

在controller目录中添加
UserController.php

在路由route.php文件中建立控制器路由

Set the address and name from the from array in config/mail.php. Those will be used to send account confirmation and password reset emails to the users.
设置电子邮件,将通过电子邮件发送确认邮件

这里设置为mailgun的 可以到https://mailgun.com注册一个免费的账号 或者设置为sendmail,smtp都可以看具体的需求

用户模型

修改数据库文件config/database.php

将mysql的用户名密码填入

‘mysql’ => array(
‘driver’    => ‘mysql’,
‘host’      => ‘localhost’,
‘database’  => ‘dev_user_test’,
‘username’  => ‘root’,
‘password’  => ‘root’,
‘charset’   => ‘utf8’,
‘collation’ => ‘utf8_unicode_ci’,
‘prefix’    => ”,
),

通过migrate将数据库迁移进去
分别执行

php artisan confide:migration

php artisan migrate

这个时候数据库会生成3个表

屏幕快照 2014-09-10 下午11.10.27

修改model/user.php 将里面的代码都替换为

<?php

use Zizaco\Confide\ConfideUser;
use Zizaco\Confide\ConfideUserInterface;

class User extends Eloquent implements ConfideUserInterface
{
use ConfideUser;
}

执行以下命令,分别配置控制器与路由
php artisan confide:controller
php artisan confide:routes

最后更新一下自动加载

composer dump-autoload

到这里用户登陆验证已可以使用

修改一下的hello.php

<h2><a href=”/users/create”>注册新用户</a></h2>
<h2><a href=”/users/login”>登陆</a></h2>
<?php if (Auth::check()){ ?>
<h2><a href=”/users/forgotPassword”>取回密码</a></h2>
<h2><a href=”/users/resetPassword”>重设密码</a></h2>
<h2><a href=”/users/logout”>退出</a></h2>
<?php } ?>

控制器方法

注册 /users/create
登陆 /users/login
取回密码 /users/forgotPassword
重设密码 /users/resetPassword
退出 /users/logout

C# Invalid credentials for database “XXXXX” 错误

项目要求拿C#来进行一个小软件的开发,遇到一个的问题记录一下

连接数据库查询时如果使用admin账号会出现会提示C# Invalid credentials for database “XXXXX” 错误

解决方法是在用户后面加上 admin 标识

原连接字符串

var conStr = “mongodb://root:123456@192.168.1.1”;

修改为

var conStr = “mongodb://root(admin):123456@192.168.1.1”;

问题解决,不知道是什么原因,懒得探讨了

单一前导Url的rewrite

Apache2

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]

 

Ngingx

location / { // …..省略部分代码
   if (!-e $request_filename) {
   rewrite  ^(.*)$  /index.php?s=$1  last;
   break;
    }
 }

执行一次SQL,UPDATE多行记录

一般情况下更新一条记录

UPDATE TABLE SET `FIELD` ='value' WHERE id ='$id';

 

如果多N条记录需要更新,那就必须是

foreach ($sql as $id => $ordinal) {
....
UPDATE TABLE SET `FIELD` ='value' WHERE id ='$id';
 
.....
}

更好的解决方案

UPDATE TABLE
    SET `FIELD` = CASE `ID`
        WHEN ID1 THEN 'value'
        WHEN ID2 THEN 'value'
        WHEN ID3 THEN 'value'
    END
WHERE id IN (ID1,ID2,ID3)

 

如果你需要更新一行记录的多个字段,可以用以下SQL语句:

UPDATE Mate
    SET MateKey = CASE id
        WHEN ID1 THEN 3
        WHEN ID2 THEN 4
        WHEN ID3 THEN 5
    END,
    title = CASE id
        WHEN ID1 THEN 'New Title 1'
        WHEN ID2 THEN 'New Title 2'
        WHEN ID3 THEN 'New Title 3'
    END
WHERE id IN (1,2,3)

 

 

按照语法,PHP的示例

$display_order = array(
ID1 => NEW VALUE,
ID2 => NEW VALUE,
ID3 => NEW VALUE,
ID4 => NEW VALUE,
ID5 => NEW VALUE,
ID6 => NEW VALUE,
ID7 => NEW VALUE,
ID8 => NEW VALUE
);
$ids = implode(',', $ids);
$sql = "UPDATE `Postmeta` SET `mate_value` = CASE `mate_key` ";
 
foreach ($mate_set as $key => $ordinal) {
$sql .= sprintf("WHEN '%s' THEN '%s' ", $key, $ordinal);  // 拼接SQL语句
}
 
$sql .= "END WHERE `post_id` = '$id' AND `mate_key` IN ($ids)";
 
$model->quert($sql);

PHP 计算页面执行时间

< ?php
class runtime
{ 
var $StartTime = 0; 
var $StopTime = 0; 
 
function get_microtime() 
{ 
list($usec, $sec) = explode(' ', microtime()); 
return ((float)$usec + (float)$sec); 
} 
 
function start() 
{ 
$this->StartTime = $this->get_microtime(); 
} 
 
function stop() 
{ 
$this->StopTime = $this->get_microtime(); 
} 
 
function spent() 
{ 
return round(($this->StopTime - $this->StartTime) * 1000, 1); 
} 
 
}
 
//例子 
$runtime= new runtime;
$runtime->start();
 
//你的代码开始
 
$a = 0;
for($i=0; $i&lt;1000000; $i++)
{
$a += $i;
}
 
//你的代码结束
 
$runtime->stop();
echo "页面执行时间: ".$runtime->spent()." 毫秒";
 
?>

将yii-bootstrap 添加到Yii框架中

Bootstrap 是神马东西,不用在这里描述了。安装的过程中按照官方的方式进行。

第一步:首先下载扩展包解压至protected\extensions目录形成bootstrap文件夹

第二步:在配置文件中配置:

 

Yii::setPathOfAlias('bootstrap', dirname(__FILE__).'/../extensions/bootstrap');
 
return array(
    'modules'=>array(
        'gii'=>array(
            'generatorPaths'=>array(
                'bootstrap.gii',
            ),
        ),
    ),
    'components'=>array(
        'bootstrap'=>array(
            'class'=>'bootstrap.components.Bootstrap', //执行Bootstrap.php文件
        ),
    ),

第三步

<?php Yii::app()->bootstrap->register(); ?>

将该段代码载入到页面模板中。

到这里,应该就可以正常运作了

Yii bootstrap

如果遇到以下问题

Alias “bootstrap.components.Bootstrap” is invalid. Make sure it points to an existing PHP file and the file is readable.

解决方法,将bootstrap目录的权限,修改为755

Sublime Text 2 增加php 运行方式

PHP Build System to Sublime Text 2

打开Sublime Text 2

选择: “Tools > Build System > New Build System…”  创建新的Build System

在打开的窗口中可以看到

{
    "cmd": ["make"]
}

将其修改为

{
    "cmd": ["/usr/bin/php", "$file"]
}

在MACOS 下PHP的路径为/usr/bin/php ,请寻找对应的系统路径进行更改。

保存,这个必须保存在sublime text 的user 目录中。

重启软件,Command + B

 

OK PASS

 

nginx upload 上传大文件

先上图
使用PHP 上传文件,无论是通过flash 还是相关的插件,对资源的消耗都是非常可怕。
在虚拟机环境下实测一个500M的文件,一个上传进程,系统的Load 1.5。
通过nginx upload 第三方模块文件上传,这样可以减少php对资源的消耗。
在虚拟机环境下实测一个500M的文件,一个上传进程,系统的Load 0.3 基本忽略不计。具体的效率如何,还需要在实际的生产环境中去验证。
以下是该模块的使用, 搭建好环境后,配合Uploadify 即可满足大大大文件的上传

nginx
nginx upload 模块
编译nginx 模块
tar zxvf nginx-1.2.2.tar.gz
tar zxvf nginx_upload_module-2.2.0.tar.gz
cd nginx-1.2.2
./configure –user=www –group=www –prefix=/usr/local/webserver/nginx –with-http_stub_status_module –with-http_ssl_module –add-module=../nginx_upload_module-2.2.0/
make && make install
编译完成后killall nginx
重新启动NGINX 模块即可生效
NGINX 配置

location /upload {
# Pass altered request body to this location
upload_pass /up/uploadify.php; # 转发到指定的后台程序进行处理,根据实际程序需要修改
# Store files to this directory
# The directory is hashed, subdirectories 0 1 2 3 4 5 6 7 8 9 should exist
upload_store /home/temp/uploads;

# Allow uploaded files to be read only by user
upload_store_access user:r;
# 限制上传速度,实际生成环境可放宽到更高。
upload_limit_rate 128k;

# Set specified fields in request body
upload_set_form_field “${upload_field_name}_name” $upload_file_name;
upload_set_form_field “${upload_field_name}_content_type” $upload_content_type;
upload_set_form_field “${upload_field_name}_path” $upload_tmp_path;

# Inform backend about hash and size of a file
upload_aggregate_form_field “${upload_field_name}_md5” $upload_file_md5;
upload_aggregate_form_field “${upload_field_name}_size” $upload_file_size;

upload_pass_form_field “^submit$|^description$”;
}

 

后端PHP 接收参数
<?php
echo “REQUEST :”;
echo “Upload: ” . $_REQUEST[“file_name”] . “”;     // 上传文件名 xxxx.jpg
echo “Type: ” . $_REQUEST[“file_content_type”] . “”; // 文件类型 image/jpg
echo “path: ” . $_REQUEST[“file_path”] . “”; // 文件路径 /tmp/000000
echo “MD5 ” . $_REQUEST[“file_md5”] . “”; // 文件MD5值 xxxxxxxxxxxxxxxx
echo “Size: ” . ($_REQUEST[“file_size”] / 1024) . “”; // 文件大小  123KB
echo “_POST:”;
echo “Name : ” . $_POST[“file_name”] . “”;
echo “Type : ” . $_POST[“file_content_type”] . “”;
echo “Path : ” . $_POST[“file_path”] . “”;
echo “MD5  : ” . $_POST[“file_md5”] . “”;
echo “Size : ” . ($_POST[“file_size”] / 1024) .  “Kb”;
?>