| <?php | 
| define('PHALAPI_INSTALL', TRUE); | 
| define('D_S', DIRECTORY_SEPARATOR); | 
|   | 
| $step = isset($_GET['step']) ? intval($_GET['step']) : 0; | 
|   | 
| switch ($step) { | 
|     //第一步:环境检测 | 
| case 1: | 
|     if (file_exists('_install.lock')) { | 
|         $error = '项目已安装,请不要重复安装,并建议手动删除 ./install 此目录以及目录下的全部文件'; | 
|         include dirname(__FILE__) . D_S . '_error.php'; | 
|         exit(0); | 
|     } | 
|     //-1:必须但不支持 0:可选但不支持 1:完美支持 | 
|     $checkList = array( | 
|         'php'       => array('name' => 'PHP 版本', 'status' => -1, 'tip' => '建议使用PHP 5.3.3及以上版本,否则DI无法支持匿名函数'), | 
|         'pdo'       => array('name' => '数据库模块', 'status' => -1, 'tip' => '建议使用PDO扩展,否则NotORM无法使用PDO进行数据库操作'), | 
|         'memcache'  => array('name' => 'Memcache扩展', 'status' => 0, 'tip' => '无此扩展时,不能使用Memcache缓存'), | 
|         'mcrypt'    => array('name' => 'Mcrypt扩展', 'status' => 0, 'tip' => '无此扩展时,不能使用mcrypt进行加密处理'), | 
|         'runtime'   => array('name' => '目录权限', 'status' => -1, 'tip' => '根目录、日志及配置文件目录若缺少写入权限,则不能写入日记和进行文件缓存以及接下配置无法生效'), | 
|     ); | 
|   | 
|     if (version_compare(PHP_VERSION, '5.3.3', '>=')) { | 
|         $checkList['php']['status'] = 1; | 
|     } | 
|     if (class_exists('PDO', false) && extension_loaded('PDO')) { | 
|         $checkList['pdo']['status'] = 1; | 
|     } | 
|     if (class_exists('Memcache', false) && extension_loaded('memcache')) { | 
|         $checkList['memcache']['status'] = 1; | 
|     } | 
|     if (extension_loaded('mcrypt')) { | 
|         $checkList['mcrypt']['status'] = 1; | 
|     } | 
|     $runtimePath = dirname(__FILE__) . implode(D_S, array('', '..', '..', 'Runtime')); | 
|     $runtimePath = file_exists($runtimePath) ? realpath($runtimePath) : $runtimePath; | 
|     $checkList['runtime']['tip'] = $runtimePath . '<br>' . $checkList['runtime']['tip']; | 
|   | 
|     $configPath = dirname(__FILE__) . implode(D_S, array('', '..', '..', 'Config')); | 
|     $configPath = file_exists($configPath) ? realpath($configPath) : $configPath; | 
|     $checkList['runtime']['tip'] = $configPath . '<br>' . $checkList['runtime']['tip']; | 
|   | 
|     $publicPath = dirname(__FILE__) . implode(D_S, array('', '..', '..', 'Public')); | 
|     $publicPath = file_exists($publicPath) ? realpath($publicPath) : $publicPath; | 
|     $checkList['runtime']['tip'] = $publicPath . '<br>' . $checkList['runtime']['tip']; | 
|   | 
|     if (is_writeable($runtimePath) && is_writeable($configPath) && is_writable($publicPath)) { | 
|         $checkList['runtime']['status'] =  1; | 
|     } | 
|   | 
|     include dirname(__FILE__) . D_S . '_step1.php'; | 
|     break; | 
|     //第2步:系统配置 | 
| case 2: | 
|     include dirname(__FILE__) . D_S . '_step2.php'; | 
|     break; | 
|     //第3步:接口请求 | 
| case 3: | 
|     if (empty($_POST['doSubmit']) || empty($_POST)) { | 
|         header('Location: ./?step=1'); | 
|         exit(0); | 
|     } | 
|   | 
|     //数据库配置文件 | 
|     $search = array( | 
|         '{project}', | 
|         '{host}', | 
|         '{name}', | 
|         '{user}', | 
|         '{password}', | 
|         '{port}', | 
|         '{charset}', | 
|         '{prefix}', | 
|     ); | 
|     $replace = array( | 
|         strtolower($_POST['project']), | 
|         $_POST['host'], | 
|         $_POST['name'], | 
|         $_POST['user'], | 
|         $_POST['password'], | 
|         $_POST['port'], | 
|         $_POST['charset'], | 
|         $_POST['prefix'], | 
|     ); | 
|     $configDbsContent = str_replace($search, $replace, getConfigDbsTpl()); | 
|     file_put_contents( | 
|         dirname(__FILE__) . implode(D_S, array('', '..', '..', 'Config', 'dbs.php')), | 
|         $configDbsContent | 
|     ); | 
|   | 
|     //Project | 
|     $project = ucwords($_POST['project']); | 
|     $appPath = dirname(__FILE__) . implode(D_S, array('', '..', '..', $project,)); | 
|     $demoPath = dirname(__FILE__) . implode(D_S, array('', '..', '..', 'Demo',)); | 
|     if (!file_exists($appPath)) { | 
|         //项目目录 | 
|         mkdir($appPath . D_S); | 
|         mkdir($appPath . D_S . 'Api'); | 
|         mkdir($appPath . D_S . 'Domain'); | 
|         mkdir($appPath . D_S . 'Model'); | 
|         mkdir($appPath . D_S . 'Common'); | 
|   | 
|         copy( | 
|             $demoPath . D_S . 'Api' . D_S . 'Default.php', | 
|             $appPath . D_S . 'Api' . D_S . 'Default.php' | 
|         ); | 
|   | 
|         mkdir($appPath . D_S . 'Tests'); | 
|         mkdir($appPath . D_S . 'Tests' . D_S . 'Api'); | 
|         mkdir($appPath . D_S . 'Tests' . D_S . 'Domain'); | 
|         mkdir($appPath . D_S . 'Tests' . D_S . 'Model'); | 
|         mkdir($appPath . D_S . 'Tests' . D_S . 'Common'); | 
|   | 
|         //单元测试 | 
|         copy( | 
|             $demoPath . D_S . 'Tests' . D_S . 'test_env.php', | 
|             $appPath . D_S . 'Tests'  . D_S . 'test_env.php' | 
|         ); | 
|         file_put_contents( | 
|             $appPath . D_S . 'Tests'  . D_S . 'test_env.php', | 
|             str_replace('Demo', $project, file_get_contents($appPath . D_S . 'Tests'  . D_S . 'test_env.php')) | 
|         ); | 
|   | 
|         copy( | 
|             $demoPath . D_S . 'Tests' . D_S . 'Api' . D_S . 'Api_Default_Test.php', | 
|             $appPath . D_S . 'Tests' . D_S . 'Api' . D_S . 'Api_Default_Test.php' | 
|         ); | 
|         copy( | 
|             $demoPath . D_S . 'Tests' . D_S . 'phpunit.xml', | 
|             $appPath . D_S . 'Tests' . D_S . 'phpunit.xml' | 
|         ); | 
|   | 
|         //访问入口 | 
|         $appPublicPath = dirname(__FILE__) . implode(D_S, array('', '..', strtolower($project), )); | 
|         $demoPublicPath = dirname(__FILE__) . implode(D_S, array('', '..', 'demo',)); | 
|   | 
|         mkdir($appPublicPath); | 
|   | 
|         copy( | 
|             $demoPublicPath . D_S . 'checkApiParams.php', | 
|             $appPublicPath . D_S . 'checkApiParams.php' | 
|         ); | 
|         copy( | 
|             $demoPublicPath . D_S . 'listAllApis.php', | 
|             $appPublicPath . D_S . 'listAllApis.php' | 
|         ); | 
|         copy( | 
|             $demoPublicPath . D_S . 'index.php', | 
|             $appPublicPath . D_S . 'index.php' | 
|         ); | 
|   | 
|         // 挂载项目 | 
|         foreach (array('checkApiParams.php', 'listAllApis.php', 'index.php') as $publicFile) { | 
|             file_put_contents( | 
|                 $appPublicPath . D_S . $publicFile, | 
|                 str_replace('Demo', $project, file_get_contents($demoPublicPath . D_S . $publicFile)) | 
|             ); | 
|         } | 
|     } | 
|   | 
|     @touch('_install.lock'); | 
|   | 
|     //请求链接 | 
|     $relatePath = substr($_SERVER['REQUEST_URI'], 0, stripos($_SERVER['REQUEST_URI'], '/install/')); | 
|     $apiUrl = 'http://' . $_SERVER['HTTP_HOST'] . '/' . $relatePath . '/' . strtolower($project); | 
|     include dirname(__FILE__) . D_S . '_step3.php'; | 
|     break; | 
| default: | 
|     include dirname(__FILE__) . D_S . '_start.php'; | 
| } | 
|   | 
|   | 
| function getConfigDbsTpl() { | 
|     $configDbs = <<<EOT | 
| <?php | 
| /** | 
|  * 分库分表的自定义数据库路由配置 | 
|  */ | 
|   | 
| return array( | 
|     /** | 
|      * DB数据库服务器集群 | 
|      */ | 
|     'servers' => array( | 
|         'db_{project}' => array(                   //服务器标记 | 
|             'host'      => '{host}',               //数据库域名 | 
|             'name'      => '{name}',               //数据库名字 | 
|             'user'      => '{user}',               //数据库用户名 | 
|             'password'  => '{password}',           //数据库密码 | 
|             'port'      => '{port}',               //数据库端口 | 
|             'charset'   => '{charset}',            //数据库字符集 | 
|         ), | 
|     ), | 
|   | 
|     /** | 
|      * 自定义路由表 | 
|      */ | 
|     'tables' => array( | 
|         //通用路由 | 
|         '__default__' => array( | 
|             'prefix' => '{prefix}', | 
|             'key' => 'id', | 
|             'map' => array( | 
|                 array('db' => 'db_{project}'), | 
|             ), | 
|         ), | 
|   | 
|         /** | 
|         'demo' => array(                                                //表名 | 
|             'prefix' => '{prefix}',                                     //表名前缀 | 
|             'key' => 'id',                                              //表主键名 | 
|             'map' => array(                                             //表路由配置 | 
|                 array('db' => 'db_{project}'),                               //单表配置:array('db' => 服务器标记) | 
|                 array('start' => 0, 'end' => 2, 'db' => 'db_{project}'),     //分表配置:array('start' => 开始下标, 'end' => 结束下标, 'db' => 服务器标记) | 
|             ), | 
|         ), | 
|          */ | 
|     ), | 
| ); | 
|   | 
| EOT; | 
|   | 
|     return $configDbs; | 
| } |