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 . '
' . $checkList['runtime']['tip']; $configPath = dirname(__FILE__) . implode(D_S, array('', '..', '..', 'Config')); $configPath = file_exists($configPath) ? realpath($configPath) : $configPath; $checkList['runtime']['tip'] = $configPath . '
' . $checkList['runtime']['tip']; $publicPath = dirname(__FILE__) . implode(D_S, array('', '..', '..', 'Public')); $publicPath = file_exists($publicPath) ? realpath($publicPath) : $publicPath; $checkList['runtime']['tip'] = $publicPath . '
' . $checkList['runtime']['tip']; if (is_writeable($runtimePath) && is_writeable($configPath)) { $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 = << 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; }