php源码_php源码加密 - CSDN
精华内容
参与话题
  • Leon的 php源码阅读笔记 一

    千次阅读 2018-03-30 18:22:52
    写这个阅读笔记系列的初衷,是帮助自己消化啃完源码。所谓:好记性不如烂笔头,自己写一遍与干读真的会有不一样的收获。 千里之行,始于足下。 先开始写,最后再来整理 第一章:一个完整的SAPI生命周期 特性、...

    原文:https://www.leon0204.com/article/120.html

    写这个阅读笔记系列的初衷,是帮助自己消化啃完源码。所谓:好记性不如烂笔头,自己写一遍与干读真的会有不一样的收获。

    千里之行,始于足下。 先开始写,最后再来整理

    第一章:一个完整的SAPI生命周期

    特性、历史概念、跳过

    SAPI (Server Application Programming Interface)

    服务器端应用编程端口

    PHP 中常用的 SAPI 有 给Shell的 cli、php-fpm ,给apache的mod_php5cli 是命令行下执行 PHP 脚本的实现:bin/php script.php,它是单进程的,处理模型比较简单,而php-fpm相对比较复杂,它实现了网络处理模块,用于与web服务器交互。

    Zend引擎

    编译器: 负责将PHP代码编译为抽象语法树,然后进一步编译为可执行的opcodes,这个过程相当于GCC的工作,编译器是一个语言实现的基础

    执行器: 负责执行编译器输出的opcodes,也就是执行PHP脚本中编写的代码逻辑

    用户代码执行

    php开始执行之后,会经历两个阶段:
    处理请求开始之前的开始阶段
    模块初始化阶段:(MINIT)。执行PHP注册模块的的MINIT函数,相当于模块初始化,注册常量、定义模块使用的类。

    //sapi/cgi/cgi_main.c
    /* {{{ PHP_MINIT_FUNCTION
     */
    static PHP_MINIT_FUNCTION(cgi)
    {
        //注册 INI 配置
        REGISTER_INI_ENTRIES();
        return SUCCESS;
    }

    模块激活阶段:(RINIT)
    请求到达之后PHP初始化执行脚本的基本环境,变量名称和值内容的符号表,当前所有的函数以及类等信息的符号表。

    请求处理完后就进入了结束阶段,一般脚本执行到末尾或者通过调用exit()或die()函数, PHP都将进入结束阶段。和开始阶段对应,结束阶段也分为两个环节,一个在请求结束后停用模块(RSHUTDOWN,结束RINIT), 一个在SAPI生命周期结束(Web服务器退出或者命令行脚本执行完毕退出)时关闭模块(MSHUTDOWN,结束MINIT)。

    /* {{{ PHP_MSHUTDOWN_FUNCTION
     */
    static PHP_MSHUTDOWN_FUNCTION(cgi)
    {
        zend_hash_destroy(&CGIG(user_config_cache));
        //注销 INI 配置
        UNREGISTER_INI_ENTRIES();
        return SUCCESS;
    }
    /* }}} */

    单进程SAPI 的生命周期
    这里写图片描述

    单进程SAPI 生命周期 文字版:

    1 启动

    在调用每个模块的模块初始化前,会有一个初始化的过程,它包括:

    1.1 初始化若干全局变量

    这里的初始化全局变量大多数情况下是将其设置为NULL,有一些除外,比如设置zuf(zend_utility_functions), 以zuf.printf_function = php_printf为例,这里的php_printf在zend_startup函数中会被赋值给zend_printf作为全局函数指针使用, 而zend_printf函数通常会作为常规字符串输出使用,比如显示程序调用栈的debug_print_backtrace就是使用它打印相关信息。

    1.2 初始化若干常量

    这里的常量是PHP自己的一些常量,这些常量要么是硬编码在程序中,比如PHP_VERSION,要么是写在配置头文件中, 比如 PEAR_EXTENSION_DIR,这些是写在config.w32.h文件中。

    1.3 初始化Zend引擎和核心组件

    前面提到的zend_startup函数的作用就是初始化Zend引擎,这里的初始化操作包括内存管理初始化、 全局使用的函数指针初始化(如前面所说的zend_printf等),对PHP源文件进行词法分析、语法分析、 中间代码执行的函数指针的赋值,初始化若干 HashTable(比如函数表,常量表等等),为ini文件解析做准备, 为PHP源文件解析做准备,注册内置函数(如strlen、define等),注册标准常量(如E_ALL、TRUE、NULL等)、注册GLOBALS全局变量等。

    1.4 解析 php.ini

    php_init_config 函数的作用是读取 php.ini 文件,设置配置参数,加载zend扩展并注册 PHP 扩展函数。此函数分为如下几步: 初始化参数配置表,调用当前模式下的ini初始化配置,比如CLI模式下,会做如下初始化:

    INI_DEFAULT("report_zend_debug", "0");
    INI_DEFAULT("display_errors", "1"); //记录错误信息

    不过在其它模式下却没有这样的初始化操作。接下来会的各种操作都是查找ini文件:

    判断是否有 php_ini_path_override ,在CLI模式下可以通过-c参数指定此路径(在php的命令参数中-c表示在指定的路径中查找ini文件)。
    如果没有php_ini_path_override,判断php_ini_ignore是否为非空(忽略php.ini配置,这里也就CLI模式下有用,使用-n参数)。
    如果不忽略ini配置,则开始处理 php_ini_search_path(查找ini文件的路径),这些路径包括CWD(当前路径,不过这种不适用CLI模式)、 执行脚本所在目录、环境变量PATH和PHPRC和配置文件中的 PHP_CONFIG_FILE_PATH的值。
    在准备完查找路径后,PHP会判断现在的ini路径(php_ini_file_name)是否为文件和是否可打开。 如果这里ini路径是文件并且可打开,则会使用此文件, 也就是CLI模式下通过-c参数指定的ini文件的优先级是最高的, 其次是PHPRC指定的文件,第三是在搜索路径中查找php-%sapi-module-name%.ini文件(如CLI模式下应该是查找php-cli.ini文件), 最后才是搜索路径中查找php.ini文件。

    1.5 全局操作函数的初始化

    php_startup_auto_globals函数会初始化在用户空间所使用频率很高的一些全局变量,如:$_GET、$_POST、$_FILES等。 这里只是初始化,所调用的zend_register_auto_global函数也只是将这些变量名添加到CG(auto_globals)这个变量表。

    php_startup_sapi_content_types函数用来初始化SAPI对于不同类型内容的处理函数, 这里的处理函数包括POST数据默认处理函数、默认数据处理函数等。

    1.6 初始化静态构建的模块和共享模块(MINIT)

    php_register_internal_extensions_func 函数用来注册静态构建的模块,也就是默认加载的模块, 我们可以将其认为内置模块。 包括PHP标准扩展模块(/ext/standard/目录, 这里是我们用的最频繁的函数.
    比如:字符串函数

    /ext/standard/php_string.h
    PHP_FUNCTION(str_replace);
    /ext/standard/string.c
    /* {{{ php_str_replace_in_subject
     */
    static zend_long php_str_replace_in_subject(zval *search, zval *replace, zval *subject, zval *result, int case_sensitivity)
        // 省略具体实现代码
    
    /* }}} */

    模块初始化会执行两个操作:

    1 将这些模块注册到已注册模块列表(module_registry),如果注册的模块已经注册过了,PHP会报Module XXX already loaded的错误。比如你在ini加载两次同样的模块就会在启动php时候报这个错误。

    2 将每个模块中包含的函数注册到函数表( CG(function_table) ),如果函数无法添加,则会报 Unable to register functions, unable to load。

    在注册了静态构建的模块后,PHP会注册附加的模块,不同的模式下可以加载不同的模块集,比如在CLI模式下是没有这些附加的模块的。

    在内置模块和附加模块后,接下来是注册通过共享对象(比如DLL)和php.ini文件灵活配置的扩展。

    在所有的模块都注册后,PHP会马上执行模块初始化操作(zend_startup_modules)。 它的整个过程就是依次遍历每个模块,调用每个模块的模块初始化函数, 也就是在本小节前面所说的用宏PHP_MINIT_FUNCTION包含的内容。

    1.7 禁用函数和类

    php_disable_functions 函数用来禁用PHP的一些函数。这些被禁用的函数来自PHP的配置文件的disable_functions变量。 其禁用的过程是调用zend_disable_function函数将指定的函数名从CG(function_table)函数表中删除。

    php_disable_classes函数用来禁用PHP的一些类。这些被禁用的类来自PHP的配置文件的 disable_classes 变量。 其禁用的过程是调用zend_disable_class 函数将指定的类名从CG(class_table)类表中删除。

    1.8 ACTIVATION

    在处理了文件相关的内容,PHP会调用 php_request_startup 做请求初始化操作。 请求初始化操作,除了图中显示的调用每个模块的请求初始化函数外,还做了较多的其它工作,其主要内容如下:

    1.8.1 激活Zend引擎

    gc_reset 函数用来重置垃圾收集机制,初始化 栈、php执行环境中的错误处理,异常处理等。 通过php.ini配置的zend_extensions也是在这里被遍历调用activate函数。

    1.8.2 激活SAPI

    sapi_activate函数用来初始化SG(sapi_headers)SG(request_info),并且针对HTTP请求的方法设置一些内容, 比如当请求方法为HEAD时,设置SG(request_info).headers_only=1 ; 此函数最重要的一个操作是处理请求的数据,其最终都会调用sapi_module.default_post_reader

    int php_startup_sapi_content_types(void)
    {
        sapi_register_default_post_reader(php_default_post_reader);
        sapi_register_treat_data(php_default_treat_data);
        sapi_register_input_filter(php_default_input_filter, NULL);
        return SUCCESS;
    }

    sapi_module.default_post_reader 在前面的模块初始化是通过php_startup_sapi_content_types 函数注册了 默认处理函数为 main/php_content_types.c 文件中php_default_post_reader 函数。 此函数会将POST的原始数据写入$HTTP_RAW_POST_DATA变量。

    /* {{{ SAPI_POST_READER_FUNC
     */
    SAPI_API SAPI_POST_READER_FUNC(php_default_post_reader)
    {
        if (!strcmp(SG(request_info).request_method, "POST")) {
            if (NULL == SG(request_info).post_entry) {
                /* no post handler registered, so we just swallow the data */
                sapi_read_standard_form_data();
            }
        }
    }
    /* }}} */

    在处理了post数据后,PHP会通过sapi_module.read_cookies读取cookie的值, 在CLI模式下,此函数的实现为sapi_cli_read_cookies,而在函数体中却只有一个return NULL;

    如果当前模式下有设置activate函数,则运行此函数,激活SAPI,在CLI模式下此函数指针被设置为NULL。

    1.8.3 环境初始化

    这里的环境初始化是指在用户空间中需要用到的一些环境变量初始化,这里的环境包括服务器环境、请求数据环境等。 实际到我们用到的变量,就是 $_POST、$_GET、$_COOKIE、$_SERVER、$_ENV、$_FILES。 在模块初始化时, 通过php_startup_sapi_content_types函数注册了默认数据处理函数为main/php_variables.c文件中php_default_treat_data函数。可以仔细阅读。

    SAPI_API SAPI_TREAT_DATA_FUNC(php_default_treat_data)
    {
        char *res = NULL, *var, *val, *separator = NULL;
        const char *c_var;
        zval array;
        int free_buffer = 0;
        char *strtok_buf = NULL;
        zend_long count = 0;
    
        ZVAL_UNDEF(&array);
        switch (arg) {
            case PARSE_POST:
            case PARSE_GET:
            case PARSE_COOKIE:
                array_init(&array);
                switch (arg) {
                    case PARSE_POST:
                        zval_ptr_dtor(&PG(http_globals)[TRACK_VARS_POST]);
                        ZVAL_COPY_VALUE(&PG(http_globals)[TRACK_VARS_POST], &array);
                        break;
                    case PARSE_GET:
                        zval_ptr_dtor(&PG(http_globals)[TRACK_VARS_GET]);
                        ZVAL_COPY_VALUE(&PG(http_globals)[TRACK_VARS_GET], &array);
                        break;
                    case PARSE_COOKIE:
                        zval_ptr_dtor(&PG(http_globals)[TRACK_VARS_COOKIE]);
                        ZVAL_COPY_VALUE(&PG(http_globals)[TRACK_VARS_COOKIE], &array);
                        break;
                }
                break;
            default:
                ZVAL_COPY_VALUE(&array, destArray);
                break;
        }
    
        if (arg == PARSE_POST) {
            sapi_handle_post(&array);
            return;
        }
    
        if (arg == PARSE_GET) {     /* GET data */
            c_var = SG(request_info).query_string;
            if (c_var && *c_var) {
                res = (char *) estrdup(c_var);
                free_buffer = 1;
            } else {
                free_buffer = 0;
            }
        } else if (arg == PARSE_COOKIE) {       /* Cookie data */
            c_var = SG(request_info).cookie_data;
            if (c_var && *c_var) {
                res = (char *) estrdup(c_var);
                free_buffer = 1;
            } else {
                free_buffer = 0;
            }
        } else if (arg == PARSE_STRING) {       /* String data */
            res = str;
            free_buffer = 1;
        }
    
        if (!res) {
            return;
        }
    
        switch (arg) {
            case PARSE_GET:
            case PARSE_STRING:
                separator = PG(arg_separator).input;
                break;
            case PARSE_COOKIE:
                separator = ";\0";
                break;
        }
    
        var = php_strtok_r(res, separator, &strtok_buf);
    
        while (var) {
            val = strchr(var, '=');
    
            if (arg == PARSE_COOKIE) {
                /* Remove leading spaces from cookie names, needed for multi-cookie header where ; can be followed by a space */
                while (isspace(*var)) {
                    var++;
                }
                if (var == val || *var == '\0') {
                    goto next_cookie;
                }
            }
    
            if (++count > PG(max_input_vars)) {
                php_error_docref(NULL, E_WARNING, "Input variables exceeded " ZEND_LONG_FMT ". To increase the limit change max_input_vars in php.ini.", PG(max_input_vars));
                break;
            }
    
            if (val) { /* have a value */
                size_t val_len;
                size_t new_val_len;
    
                *val++ = '\0';
                php_url_decode(var, strlen(var));
                val_len = php_url_decode(val, strlen(val));
                val = estrndup(val, val_len);
                if (sapi_module.input_filter(arg, var, &val, val_len, &new_val_len)) {
                    php_register_variable_safe(var, val, new_val_len, &array);
                }
                efree(val);
            } else {
                size_t val_len;
                size_t new_val_len;
    
                php_url_decode(var, strlen(var));
                val_len = 0;
                val = estrndup("", val_len);
                if (sapi_module.input_filter(arg, var, &val, val_len, &new_val_len)) {
                    php_register_variable_safe(var, val, new_val_len, &array);
                }
                efree(val);
            }
    next_cookie:
            var = php_strtok_r(NULL, separator, &strtok_buf);
        }
    
        if (free_buffer) {
            efree(res);
        }
    }
    
    1.8.4 模块请求初始化

    PHP通过 zend_activate_modules 函数实现模块的请求初始化,也就是我们在图中看到 Call each extension's RINIT。 此函数通过遍历注册在 module_registry 变量中的所有模块,调用其RINIT方法实现模块的请求初始化操作。

    1.8.5 运行

    php_execute_script 函数包含了运行PHP脚本的全部过程。

    当一个PHP文件需要解析执行时,它 可能会需要执行三个文件,其中包括一个前置执行文件、当前需要执行的主文件和一个后置执行文件。 非当前的两个文件可以在 php.ini文件通过auto_prepend_file参数和auto_append_file参数设置。 如果将这两个参数设置为空,则禁用对应的执行文件。

    对于需要解析执行的文件,通过 zend_compile_file(compile_file函数)做词法分析、语法分析和中间代码生成操作,返回此文件的所有中间代码。 如果解析的文件有生成有效的中间代码,则调用zend_execute(execute函数)执行中间代码。 如果在执行过程中出现异常并且用户有定义对这些异常的处理,则调用这些异常处理函数。 在所有的操作都处理完后,PHP通过EG(return_value_ptr_ptr)返回结果。

    2 DEACTIVATION 注销

    PHP关闭请求的过程是一个若干个关闭操作的集合,这个集合存在于main.c/php_request_shutdown函数中。 这个集合包括如下内容:

    调用所有通过register_shutdown_function()注册的函数。这些在关闭时调用的函数是在用户空间添加进来的。

    /* {{{ php_request_shutdown
     */
    void php_request_shutdown(void *dummy)
    {
        zend_bool report_memleaks;
    
        EG(flags) |= EG_FLAGS_IN_SHUTDOWN;
    
        report_memleaks = PG(report_memleaks);
    
        /* EG(current_execute_data) points into nirvana and therefore cannot be safely accessed
         * inside zend_executor callback functions.
         */
        EG(current_execute_data) = NULL;
    
        php_deactivate_ticks();
    
        /* 1. Call all possible shutdown functions registered with register_shutdown_function() */
        if (PG(modules_activated)) zend_try {
            php_call_shutdown_functions();
        } zend_end_try();
    
        /* 2. Call all possible __destruct() functions */
        zend_try {
            zend_call_destructors();
        } zend_end_try();
    
        /* 3. Flush all output buffers */
        zend_try {
            zend_bool send_buffer = SG(request_info).headers_only ? 0 : 1;
    
            if (CG(unclean_shutdown) && PG(last_error_type) == E_ERROR &&
                (size_t)PG(memory_limit) < zend_memory_usage(1)
            ) {
                send_buffer = 0;
            }
    
            if (!send_buffer) {
                php_output_discard_all();
            } else {
                php_output_end_all();
            }
        } zend_end_try();
    
        /* 4. Reset max_execution_time (no longer executing php code after response sent) */
        zend_try {
            zend_unset_timeout();
        } zend_end_try();
    
        /* 5. Call all extensions RSHUTDOWN functions */
        if (PG(modules_activated)) {
            zend_deactivate_modules();
        }
    
        /* 6. Shutdown output layer (send the set HTTP headers, cleanup output handlers, etc.) */
        zend_try {
            php_output_deactivate();
        } zend_end_try();
    
        /* 7. Free shutdown functions */
        if (PG(modules_activated)) {
            php_free_shutdown_functions();
        }
    
        /* 8. Destroy super-globals */
        zend_try {
            int i;
    
            for (i=0; i<NUM_TRACK_VARS; i++) {
                zval_ptr_dtor(&PG(http_globals)[i]);
            }
        } zend_end_try();
    
        /* 9. free request-bound globals */
        php_free_request_globals();
    
        /* 10. Shutdown scanner/executor/compiler and restore ini entries */
        zend_deactivate();
    
        /* 11. Call all extensions post-RSHUTDOWN functions */
        zend_try {
            zend_post_deactivate_modules();
        } zend_end_try();
    
        /* 12. SAPI related shutdown (free stuff) */
        zend_try {
            sapi_deactivate();
        } zend_end_try();
    
        /* 13. free virtual CWD memory */
        virtual_cwd_deactivate();
    
        /* 14. Destroy stream hashes */
        zend_try {
            php_shutdown_stream_hashes();
        } zend_end_try();
    
        /* 15. Free Willy (here be crashes) */
        zend_interned_strings_deactivate();
        zend_try {
            shutdown_memory_manager(CG(unclean_shutdown) || !report_memleaks, 0);
        } zend_end_try();
    
        /* 16. Reset max_execution_time */
        zend_try {
            zend_unset_timeout();
        } zend_end_try();
    
    #ifdef PHP_WIN32
        if (PG(com_initialized)) {
            CoUninitialize();
            PG(com_initialized) = 0;
        }
    #endif
    
    #ifdef HAVE_DTRACE
        DTRACE_REQUEST_SHUTDOWN(SAFE_FILENAME(SG(request_info).path_translated), SAFE_FILENAME(SG(request_info).request_uri), (char *)SAFE_FILENAME(SG(request_info).request_method));
    #endif /* HAVE_DTRACE */
    }
    /* }}} */

    3 结束

    3.1 Flush

    sapi_flush将最后的内容刷新出去。其调用的是sapi_module.flush,在CLI模式下等价于fflush函数。

    3.2 关闭Zend引擎

    zend_shutdown将关闭Zend引擎。

    在关闭所有的模块后,PHP继续销毁全局函数表,销毁全局类表、销售全局变量表等。 通过zend_shutdown_extensions遍历zend_extensions所有元素,调用每个扩展的shutdown函数。

    多进程SAPI生命周期 Apache

    这里写图片描述

    多线程SAPI 的生命周期

    这里写图片描述

    展开全文
  • PHP7.2源码安装

    千次阅读 2019-09-19 14:48:40
    一、下载php7.2版本的安装包 1.下载 2.上传到服务器的root目录 pwd:查看当前目录 ll:查看当前目录下的文件 二.解压 tar -xjvfphp-7.2.18.tar.bz 三.configure(编译) cd php-7.2.18 ./configure --...

    一、下载php7.2版本的安装包

    1.下载

    2.上传到服务器的root目录

    pwd:查看当前目录

    ll:查看当前目录下的文件

    二.解压

    tar -xjvf php-7.2.18.tar.bz

    三.configure(编译)

    cd php-7.2.18

    ./configure --prefix=/home/work/study

     

    四.make(构建)

    make

    make test

    五.make install

    linux对php操作的一些命令

    cd php ——进入到php

    cd ..——进入上级目录

    .bin/php -m  查看它的扩展

    vi test.php ——创建一个test.php文件夹

    <?php

    echo time();

    :wq——保存并退出

    按esc到命令模式

    按i编辑文本模式

    1、:w   保存文件但不退出vi 

    2、:w file 将修改另外保存到file中,不退出vi 

    3、:w!  强制保存,不推出vi

    4.、:wq  保存文件并退出vi 

    5、:wq! 强制保存文件,并退出vi

    6、:q 不保存文件,退出vi

    7、:q!不保存文件,强制退出vi 

    ./bin/php test.php ——执行

    六、简化php执行命令

    1.编辑根目录下的 .bash_profile文件(vi ~/.bash_profile)

    2.source ~/.bash_profile

    3.php -v

    测试

    总结:php源码安装的时候会遇到哪些坑?

    1.gcc autoconfig——如果没有编译的时候系统会提示需要装这两个软件

    2.编译后的文件,没有php.ini文件

    cp php.ini-development /home/work/study/ect/——复制到编译后的文件夹中

    mv php.ini-development php.ini——改名字

    改了php.ini的配置,不生效

    php -i |grep php.ini  

    所以将php.ini移动到lib下面

    mv ./etc/php.ini ./lib

    展开全文
  • php实现用户登录、注册以及修改功能(附加源码~)

    万次阅读 多人点赞 2019-07-30 10:51:51
    用户在注册账户时需要对用户输入的内容做check,需要对密码进行加密设置,登录时也需要进行一系列check。 登录页面 前台页面 前台页面代码denglu.html <!DOCTYPE html> <html>...s...

    本代码实现了php+Mysql数据库 用户的注册和登录功能,希望对大家有帮助,后附加源码,注释详细~

    first要贴上表结构~

    在这里插入图片描述

    登录页面

    前台登录页面denglu.html

    在这里插入图片描述
    在这里插入图片描述

    代码

    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="utf-8">
    	<title>登录页面</title>
    <script type="text/javascript">
    	//检查用户名是否填写
    	function checkName(){
    		var name = document.getElementById("add_name").value;
    		var spanNode = document.getElementById("user_name");
    		if (name != "") {
    			spanNode.innerHTML = "已填".fontcolor("green");
    			return true;
    		}else{
    			spanNode.innerHTML = "不能为空".fontcolor("red");
    			return false;
    		}
    	}
        //检查密码是否填写
        function checkPassword(){
    		var password = document.getElementById("add_password").value;
    		var spanNode = document.getElementById("user_password");
    		if (password != "") {
    				spanNode.innerHTML = "已填".fontcolor("green");
    				return true;
    			}else{
    				spanNode.innerHTML = "请输入密码".fontcolor("red");
    				return false;
    			}
    	}
    	//点击登录时进行检查
    	function checkForm(){
    		var name = checkName();
    		var password = checkPassword();
    		if (name && password) {
    			return true;
    		}else{
    			return false;
    		}
    	}
    </script>
    </head>
    <style type="text/css">
    	.wrapper{
    
            text-align: center;
    		width:1000px;
    	    margin:20px auto;
    	}
    	h2{
    	background-color:#7CCD7C;
    	margin:0px;
    	text-align:center;
        }
        .add{
        	margin:20px auto;
        }
        .add labal{
    		text-align: center;
    		background-color: 	#FFB6C1;
    		color: #fff;
    		margin:20px auto;
    	}
    	.btn { 
        	background-color: #008CBA;;
        	border-radius:8px;
        	color: white;
        	padding: 6px 93px;
        	text-align: center;
        	text-decoration: none;
        	display: inline-block;
        	font-size: 14px;
        }
        .error {
        	color: #FF0000;
        }
    </style>
    <body>
    <div class="wrapper">
    <h2>用户管理系统</h2>
    <div class="add">
    <labal>登录系统</labal>
    </div>
        <div class="add">
        <form method="post" action="denglu.php" onsubmit="return checkForm()">
    	<labal>用户名:</labal> <input type="text" name="add_name" id="add_name" placeholder="请输入用户名">
    	<span id="user_name" class="error">*</span><br><br>
    	<labal>密码:</labal>&nbsp&nbsp&nbsp&nbsp<input type="password" name="add_password" id="add_password"placeholder="请输入密码">
    	<span id="user_password" class="error">*</span><br><br>
    	<input class="btn" type="submit" value="登录">
    	<br>
    	</form>
    	<a href="zhuce.html">立即注册</a>
        </div>
    </div>
    </body>
    </html>
    

    后台处理页面代码denglu.php

    代码

    <?php
    require("./MysqlData.php");
    
    $user_name = $_POST['add_name'];
    $user_password = $_POST['add_password'];
    $password = md5($user_password);
    $data = new MysqlData;
    $sql = $data->select_user($user_name,$password);
    $res = $data->sqlRun($sql);
    //若账号密码错误
    if ($res->num_rows == 0) {
    	//释放$res占用的内存
    	mysqli_free_result($res);
    	//关闭数据库连接
    	$data->closeConn();
    	//提示输入正确的账号
    	echo "<script type='text/javascript'>";
    	echo "alert('账号密码错误,请重新输入');";
    	echo "history.back();";
    	echo "</script>"; 
    }
    //若账号密码正确
    else{
    	//获取id字段
    	$id = mysqli_fetch_object($res)->id;
    	//释放$res占用的内存
    	mysqli_free_result($res);
    
    	//关闭数据库连接
    	$data->closeConn();
    	//将用户数据加入cookies
    	setcookie("id",$id);
    	setcookie("password","TRUE");
    	header("Location:main.php");
    }
    
    $data->closeConn();
    ?>
    
    

    登录跳转页面main.php

    在这里插入图片描述
    代码

    <?php
    require("./MysqlData.php");
    /*检查cookie中的password变量是否不等于true,是的话表示尚未登录网站,就重定向到denglu.html页面*/
    $id = $_COOKIE["id"];
    $password = $_COOKIE["password"];
    if ($password != "TRUE") {
    	header("location:denglu.html");
    	exit();
    }
    //创建对象
    $data = new MysqlData;
    $sql = "SELECT * FROM users WHERE id = ".$id.";";
    $row = $data->getRow($sql);
    // echo $sql;
    $data->closeConn();
    ?>
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="utf-8">
    	<title>登录成功页面</title>
    </head>
     <style type="text/css">
     	.wrapper{
    
             text-align: center;
     		width:1000px;
     	    margin:20px auto;
     	}
     	h2{
     	background-color:#7CCD7C;
     	margin:0px;
     	text-align:center;
         }
         .my{
         	margin:20px auto;
         }
         .my labal{
         	text-align: center;
     		background-color: 	#FFB6C1;
     		color: #fff;
     		margin:20px auto;
         }
     </style>
    <body>
    <div class="wrapper">
    <h2>用户管理系统</h2>
    <div class="my">
    <labal>我的资料</labal>
    </div>
    <labal>用户名:</labal><input type="text" value="<?php echo $row['name'] ?>" readonly="readonly"><br><br>
    <labal>性别:</labal>
    <input type="radio"value="0" <?php if ($row['sex'] == "0") echo "checked"?>><input type="radio"value="1" <?php if ($row['sex'] == "1") echo "checked"?>><br><br>
    <labal>年龄:</labal><input type="text" value="<?php echo $row['age'] ?>" readonly="readonly"><br><br>
    <labal>邮箱:</labal><input type="text" value="<?php echo $row['email'] ?>" readonly="readonly"><br><br>
    <a href="modify.php">修改我的资料</a>
    </div>
    
    </body>
    </html>
    

    修改资料页面modify.php

    在这里插入图片描述
    代码

    <?php
    /*检查cookie中的password变量是否不等于true,是的话表示尚未登录网站,就重定向到denglu.html页面*/
    $id = $_COOKIE["id"];
    $password = $_COOKIE["password"];
    if ($password != "TRUE") {
    	header("location:denglu.html");
    	exit();
    }
    else{
    	require("./MysqlData.php");
    	$id = $_COOKIE["id"];
    	//连接数据库
    	$data = new MysqlData;
    
    	//执行sql查询我的资料
    	$sql = "SELECT *  FROM users WHERE id = ".$id.";";
    	$row = $data->getRow($sql);
    	//关闭数据库
    	$data->closeConn();
    }
    ?>
    
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="utf-8">
    	<title></title>
    <script type="text/javascript">
    		//检查姓名
    		function checkName(){
    			var inputNode = document.getElementById("edit_name");
    			var spanNode = document.getElementById("user_name");
    			var nameLength = document.getElementById("edit_name").value.length;
    			//获取输入框的内容
    			var content = inputNode.value;
    			// 检测名字是否只包含字母跟空格
    			var reg = /^[a-zA-Z ]*$/;
    			if(content==""){
    				spanNode.innerHTML = "不能为空".fontcolor("red");
    				return false;
    			}
    			if (nameLength > 15) {
    				spanNode.innerHTML = "姓名长度过长".fontcolor("red");
    				return false;
    			}
    			if (reg.test(content)){
    				spanNode.innerHTML = "正确".fontcolor("green");
    				return true;
    			}else{
    				spanNode.innerHTML = "只允许字母跟空格".fontcolor("red");
    				return false;
    			}
    		}
    		//检查密码
    		function checkPassword(){
    			var password = document.getElementById("edit_password");
    			var passwordLength = document.getElementById("edit_password").value.length;
    			var content = password.value;
    			var spanNode = document.getElementById("user_password");
    			if (passwordLength > 30) {
    				spanNode.innerHTML = "密码过长".fontcolor("red");
    				return false;
    			}
    			if (content != "") {
    				spanNode.innerHTML = "已填".fontcolor("green");
    				return true;
    			}else{
    				spanNode.innerHTML = "密码不能为空".fontcolor("red");
    				return false;
    			}
    		}
    		//检查再次输入的密码
    		function checkUpassword(){
    			var password = document.getElementById("edit_password").value;
    			var upassword = document.getElementById("upassword").value;
    			var spanNode = document.getElementById("uupassword");
    			if (upassword != password) {
    				spanNode.innerHTML = "密码不一致".fontcolor("red");
    				return false;
    			}
    			if (upassword != "") {
    				spanNode.innerHTML = "已填".fontcolor("green");
    				return true;
    			}else{
    				spanNode.innerHTML = "请再次输入密码".fontcolor("red");
    				return false;
    			}
    			
    		}
    		//检查性别
    		function checkSex(){
    			// var inputNode = document.getElementById("add_sex");
    			var spanNode = document.getElementById("user_sex");
    			// var content = inputNode.value;
    			//检查不能为空
    			if (!document.getElementById("man").checked && !document.getElementById("women").checked) {
    				spanNode.innerHTML = "必填".fontcolor("red");
    				return false;
    			}else{
    				spanNode.innerHTML = "已填".fontcolor("green");
    				return true;
    			}
    		}
    		//检查年龄
    		function checkAge(){
    			var age = document.getElementById("edit_age").value;
    			var spanNode = document.getElementById("user_age");
    			//检查年龄是否在1-120内
    			var reg = /^(?:[1-9][0-9]?|1[01][0-9]|120)$/;
    			if (reg.test(age)) {
    				spanNode.innerHTML = "已填".fontcolor("green");
    				return true;
    			}else{
    				spanNode.innerHTML = "年龄不合法".fontcolor("red");
    				return false;
    			}
    		}
    		//检查邮箱
    		function checkEmail(){
    			var email = document.getElementById("edit_email").value;
    		    var spanNode = document.getElementById("user_email");
    		    //验证邮箱的正则
    		    var reg = /^[a-z0-9]\w+@[a-z0-9]+(\.[a-z]{2,3}){1,2}$/i;
    		    if(email==""){
    		    	spanNode.innerHTML = "不能为空".fontcolor("red");
    		    	return false;
    		    }
    		    if (reg.test(email)){
    		    	spanNode.innerHTML = "正确".fontcolor("green");
    		    	return true;
    		    }else{
    		    	spanNode.innerHTML = "邮箱格式不正确".fontcolor("red");
    		    	return false;
    		    }
    		}
    		//提交form表单时进行检查
    		function checkForm(){
    			var add_name = checkName();
    			var add_sex = checkSex();
    			var add_age = checkAge();
    			var add_email = checkEmail();
    			var add_password = checkPassword();
    			var upassword = checkUpassword();
    			if (add_name && add_sex && add_age && add_email && add_password && upassword) {
    				return true;
    			}else{
    				return false;
    			}
    		}
    	</script>
    </head>
    <style type="text/css">
    	.wrapper{
    
            text-align: center;
    		width:1000px;
    	    margin:20px auto;
    	}
    	h2{
    	background-color:#7CCD7C;
    	margin:0px;
    	text-align:center;
        }
        .update{
        	margin:20px auto;
        }
        .update labal{
        	text-align: center;
    		background-color: 	#FFB6C1;
    		color: #fff;
    		margin:20px auto;
        }
       
        .btn { 
        	background-color: #008CBA;;
        	border-radius:8px;
        	color: white;
        	padding: 10px 20px;
        	text-align: center;
        	text-decoration: none;
        	display: inline-block;
        	font-size: 14px;
        }
        .error {
            color: #FF0000;
        }
    </style>
    <body>
    <div class="wrapper">
    	<h2>用户管理系统</h2>
    	<div class="update">
    	<labal>修改我的资料</labal>
    	</div>
    <div>
     <form method="post" action="update.php" align="center" onsubmit="return checkForm()">
         ID:&nbsp&nbsp&nbsp<input type="text" name="id" value="<?php echo $row['id'] ?>" readonly="readonly"><br><br>
    
         <labal>用户名:</labal><input type="text" id="edit_name" name="edit_name" value="<?php echo $row['name'] ?>"><span id="user_name" class="error">*</span><br><br>
    
         <labal>密码:</labal>&nbsp&nbsp&nbsp&nbsp<input type="password" name="edit_password" id="edit_password" placeholder="请设置密码">
    	<span id="user_password" class="error">*</span><br><br>
    
    	<labal>确认密码:</labal><input type="password" name="upassword" id="upassword" placeholder="请再次输入密码">
    	<span id="uupassword" class="error">*</span><br><br>
    
         <labal>性别:</labal><input type="radio" id="man" name="sex" value="0"
                             <?php if(isset($row['sex']) && $row['sex']=="0") echo "checked";?>><input type="radio" id="women" name="sex" value="1"
                             <?php if(isset($row['sex']) && $row['sex']=="1") echo "checked";?>><span id="user_sex" class="error">*</span><br><br>
    
         <labal>年龄:</labal><input type="text" id="edit_age" name="edit_age" value="<?php echo $row['age'] ?>"><span id="user_age"></span><br><br>
    
         <labal>邮箱:</labal><input type="text" id="edit_email" name="edit_email" value="<?php echo $row['email'] ?>"><span id="user_email" class="error">*</span><br><br>
         
         <input class="btn" type="submit" name="submit" value="确认修改">
      </form>
    </body>
    </html>
    

    后台处理update.php

    代码

    <?php
    /*检查cookie中的password变量是否不等于true,是的话表示尚未登录网站,就重定向到denglu.html页面*/
    $id = $_COOKIE["id"];
    $password = $_COOKIE["password"];
    if ($password != "TRUE") {
    	header("location:denglu.html");
    	exit();
    }else{
    	require("./MysqlData.php");
        $u_id = $_POST['id'];
    	$name = $_POST['edit_name'];
    	$u_password = $_POST['edit_password'];
    	$sex = $_POST['sex'];
    	$age = $_POST['edit_age'];
    	$email = $_POST['edit_email'];
    	//创建对象,连接数据库
    	$data = new MysqlData;
    
    	//执行更新sql语句
    	$sql = "UPDATE users SET name = '".$name."',password = '".$u_password."',sex = ".$sex.",age = ".$age.",email = '".$email."' WHERE id = ".$u_id.";";
    	$res = $data->sqlRun($sql);
    	$data->closeConn();
    	header("Location:main.php");
    }
    
    

    注册页面

    前台页面zhuce.html

    在这里插入图片描述
    在这里插入图片描述
    代码

    <!DOCTYPE html>
    <html>
    <head>
    	<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    	<title>注册新用户</title>
    	<script type="text/javascript">
    		//检查姓名
    		function checkName(){
    			var inputNode = document.getElementById("add_name");
    			var spanNode = document.getElementById("user_name");
    			var nameLength = document.getElementById("add_name").value.length;
    			//获取输入框的内容
    			var content = inputNode.value;
    			// 检测名字是否只包含字母跟空格
    			var reg = /^[a-zA-Z ]*$/;
    			if(content==""){
    				spanNode.innerHTML = "不能为空".fontcolor("red");
    				return false;
    			}
    			if (nameLength > 15) {
    				spanNode.innerHTML = "姓名长度过长".fontcolor("red");
    				return false;
    			}
    			if (reg.test(content)){
    				spanNode.innerHTML = "正确".fontcolor("green");
    				return true;
    			}else{
    				spanNode.innerHTML = "只允许字母跟空格".fontcolor("red");
    				return false;
    			}
    		}
    		//检查密码
    		function checkPassword(){
    			var password = document.getElementById("add_password");
    			var passwordLength = document.getElementById("add_password").value.length;
    			var content = password.value;
    			var spanNode = document.getElementById("user_password");
    			if (passwordLength > 30) {
    				spanNode.innerHTML = "密码过长".fontcolor("red");
    				return false;
    			}
    			if (content != "") {
    				spanNode.innerHTML = "已填".fontcolor("green");
    				return true;
    			}else{
    				spanNode.innerHTML = "密码不能为空".fontcolor("red");
    				return false;
    			}
    		}
    		//检查再次输入的密码
    		function checkUpassword(){
    			var password = document.getElementById("add_password").value;
    			var upassword = document.getElementById("upassword").value;
    			var spanNode = document.getElementById("uupassword");
    			if (upassword != password) {
    				spanNode.innerHTML = "密码不一致".fontcolor("red");
    				return false;
    			}
    			if (upassword != "") {
    				spanNode.innerHTML = "已填".fontcolor("green");
    				return true;
    			}else{
    				spanNode.innerHTML = "请再次输入密码".fontcolor("red");
    				return false;
    			}
    			
    		}
    		//检查性别
    		function checkSex(){
    			// var inputNode = document.getElementById("add_sex");
    			var spanNode = document.getElementById("user_sex");
    			// var content = inputNode.value;
    			//检查不能为空
    			if (!document.getElementById("man").checked && !document.getElementById("women").checked) {
    				spanNode.innerHTML = "必填".fontcolor("red");
    				return false;
    			}else{
    				spanNode.innerHTML = "已填".fontcolor("green");
    				return true;
    			}
    		}
    		//检查年龄
    		function checkAge(){
    			var age = document.getElementById("add_age").value;
    			var spanNode = document.getElementById("user_age");
    			//检查年龄是否在1-120内
    			var reg = /^(?:[1-9][0-9]?|1[01][0-9]|120)$/;
    			if (reg.test(age)) {
    				spanNode.innerHTML = "已填".fontcolor("green");
    				return true;
    			}else{
    				spanNode.innerHTML = "年龄不合法".fontcolor("red");
    				return false;
    			}
    		}
    		//检查邮箱
    		function checkEmail(){
    			var email = document.getElementById("add_email").value;
    		    var spanNode = document.getElementById("user_email");
    		    //验证邮箱的正则
    		    var reg = /^[a-z0-9]\w+@[a-z0-9]+(\.[a-z]{2,3}){1,2}$/i;
    		    if(email==""){
    		    	spanNode.innerHTML = "不能为空".fontcolor("red");
    		    	return false;
    		    }
    		    if (reg.test(email)){
    		    	spanNode.innerHTML = "正确".fontcolor("green");
    		    	return true;
    		    }else{
    		    	spanNode.innerHTML = "邮箱格式不正确".fontcolor("red");
    		    	return false;
    		    }
    		}
    		//提交form表单时进行检查
    		function checkForm(){
    			var add_name = checkName();
    			var add_sex = checkSex();
    			var add_age = checkAge();
    			var add_email = checkEmail();
    			var add_password = checkPassword();
    			var upassword = checkUpassword();
    			if (add_name && add_sex && add_age && add_email && add_password && upassword) {
    				return true;
    			}else{
    				return false;
    			}
    		}
    	</script>
    </head>
    <style type="text/css">
    	.wrapper{
    
            text-align: center;
    		width:1000px;
    	    margin:20px auto;
    	}
    	h2{
    	background-color:#7CCD7C;
    	margin:0px;
    	text-align:center;
        }
        .add{
        	margin:20px auto;
        }
    	.add labal{
    		text-align: center;
    		background-color: 	#FFB6C1;
    		color: #fff;
    		margin:20px auto;
    	}
    	.btn { 
        	background-color: #008CBA;;
        	border-radius:8px;
        	color: white;
        	padding: 6px 93px;
        	text-align: center;
        	text-decoration: none;
        	display: inline-block;
        	font-size: 14px;
        }
        .error {
        	color: #FF0000;
        }
    </style>
    <body>
    <div class="wrapper">
    <h2>用户管理系统</h2>
    <div class="add">
    <labal>注册新用户</labal>
    </div>
        <div>
        <form method="post" action="zhuce.php" onsubmit="return checkForm()">
    	<labal>用户名:</labal> <input type="text" name="add_name" id="add_name" placeholder="请设置用户名">
    	<span id="user_name" class="error">*</span><br><br>
    
    	<labal>密码:</labal>&nbsp&nbsp&nbsp&nbsp<input type="password" name="add_password" id="add_password" placeholder="请设置密码">
    	<span id="user_password" class="error">*</span><br><br>
    
    	<labal>确认密码:</labal><input type="password" name="upassword" id="upassword" placeholder="请再次输入密码">
    	<span id="uupassword" class="error">*</span><br><br>
    	
    	<labal>性别:</labal><input type="radio" name="add_sex" id="man" value="0"><input type="radio" name="add_sex" id="women" value="1"><span id="user_sex" class="error">*</span>
    	<br><br> 
    	<labal>年龄:</labal><input type="text" name="add_age" id="add_age"placeholder="请输入年龄"><span id="user_age"></span><br><br>
    	<labal>邮箱:</labal><input type="text" name="add_email" id="add_email" placeholder="请输入邮箱">
    	<span id="user_email" class="error">*</span><br><br>
    	<input class="btn" type="submit" value="注册">
        </form>
        </div>
    </div>
    </body>
    </html>
    

    后台处理zhuce.php

    在这里插入图片描述
    代码

    <?php
    require("./MysqlData.php");
    
    $name = $_POST["add_name"];
    $password = $_POST["add_password"];
    $upassword = $_POST["upassword"];
    $sex = $_POST["add_sex"];
    $age = $_POST["add_age"];
    $email = $_POST["add_email"];
    
    //md5加密
    $user_password = md5($password);
    $zhuce_password = md5($upassword);
    
    $data = new MysqlData;
    $sele_sql = "SELECT * FROM users WHERE name = '".$name."';";
    $res = $data->sqlRun($sele_sql);
    // echo $sele_sql;
    //若账号被使用
    if ($res->num_rows != 0) {
    	//释放res内存
    	mysqli_free_result($res);
    	//提示用户已经有人使用
    	echo "<script type='text/javascript'>";
    	echo "alert('此账号已经有人使用');";
    	echo "history.back();";
    	echo "</script>";
    }//若账号没人使用
    else{
    	//释放$res占用的内存
    	mysqli_free_result($res);
    	//
    	$zhuce_sql = $data->zhuceData($name,$user_password,$sex,$age,$email);
    	$res = $data->sqlRun($zhuce_sql);
    }
    //关闭数据库连接
    $data->closeConn();
    ?>
    <!DOCTYPE html>
    <html>
    <head>
    	<meta charset="utf-8">
    	<title>注册成功页面</title>
    </head>
     <style type="text/css">
     	.wrapper{
    
             text-align: center;
     		width:1000px;
     	    margin:20px auto;
     	}
     	h2{
     	background-color:#7CCD7C;
     	margin:0px;
     	text-align:center;
         }
         .my{
         	margin:20px auto;
         }
         .my labal{
         	text-align: center;
     		background-color: 	#FFB6C1;
     		color: #fff;
     		margin:20px auto;
         }
     </style>
    <body>
    <div class="wrapper">
    <h2>用户管理系统</h2>
    <div class="my">
    <labal>我的注册信息</labal>
    </div>
    <labal>用户名:</labal><input type="text" value="<?php echo $name ?>" readonly="readonly"><br><br>
    <labal>性别:</labal>
    <input type="radio"value="0" <?php if ($sex == "0") echo "checked"?>><input type="radio"value="1" <?php if ($sex == "1") echo "checked"?>><br><br>
    <labal>年龄:</labal><input type="text" value="<?php echo $age ?>" readonly="readonly"><br><br>
    <labal>邮箱:</labal><input type="text" value="<?php echo $email ?>" readonly="readonly"><br><br>
    <a href="denglu.html">返回登录页面</a>
    </div>
    </body>
    </html>
    
    
    
    
    展开全文
  • PHP 7.2 源码

    2020-07-30 23:30:03
    php7.2 最新版源码包,本人亲自使用,没问题在放在上面供大家使用
  • php源码安装 centos

    2018-08-06 15:45:30
    在群里有小伙伴说php源码安装有困难。 现调试一番 以下以CentOS 7.2为例,安装php的运行环境,首先打开php官网http://php.net/点击导航栏的Downloads进入下载页面:http://php.net/downloads.php  这里下载最新...

    在群里有小伙伴说php源码安装有困难。 现调试一番

    以下以CentOS 7.2为例,安装php的运行环境,首先打开php官网http://php.net/点击导航栏的Downloads进入下载页面:http://php.net/downloads.php

      这里下载最新版的php 7.0.5 的源码包:

      

      下载下来之后上传至服务器

      因为php安装需要编译,所以服务器应该保证gcc和g++环境的安装

      首先释放安装包:

    
     
    1. tar -xvzf php-7.0.5.tar.gz

    2. cd php-7.0.5

      接下来进行参数配置,配置前如果没有libxml2和libxml2-devel会报错,所以应该更新libxml2并安装libxml2-devel,使用在线安装:

    
     
    1. yum -y install libxml2

    2. yum -y install libxml2-devel

      补充,因为不同的操作系统环境,系统安装开发环境包的完整程度也不相同,所以建议安装操作系统的时候做必要选择,也可以统一执行一遍所有的命令,将没有安装的组件安装好,如果已经安装了可能会进行升级,版本完全一致则不会进行任何操作,命令除上面2个之外,汇总如下:

     

    
     
    1. yum -y install openssl

    2. yum -y install openssl-devel

    3. yum -y install curl

    4. yum -y install curl-devel

    5. yum -y install libjpeg

    6. yum -y install libjpeg-devel

    7. yum -y install libpng

    8. yum -y install libpng-devel

    9. yum -y install freetype

    10. yum -y install freetype-devel

    11. yum -y install pcre

    12. yum -y install pcre-devel

    13. yum -y install libxslt

    14. yum -y install libxslt-devel

    15. yum -y install bzip2

    16. yum -y install bzip2-devel

     

      以上这些包基本上够用了,如果发现问题再补充,安装完成之后,执行配置:

    ./configure --prefix=/usr/local/php --with-curl --with-freetype-dir --with-gd --with-gettext --with-iconv-dir --with-kerberos --with-libdir=lib64 --with-libxml-dir --with-mysqli --with-openssl --with-pcre-regex --with-pdo-mysql --with-pdo-sqlite --with-pear --with-png-dir --with-jpeg-dir --with-xmlrpc --with-xsl --with-zlib --with-bz2 --with-mhash --enable-fpm --enable-bcmath --enable-libxml --enable-inline-optimization --enable-gd-native-ttf --enable-mbregex --enable-mbstring --enable-opcache --enable-pcntl --enable-shmop --enable-soap --enable-sockets --enable-sysvsem --enable-sysvshm --enable-xml --enable-zip

      实际上这里的配置项比上述还多,可以使用 ./configure --help 命令查看所有选项,这里注意在php7中--with-mysql原生支持已经不存在了,操作都变成mysqli或者pdo了;以上这些选项在正常的php开发中完全够用了,后期如果需要,可以选择手动开启相应的模块

      然后执行编译:

          特别注意的是这里有的小伙伴可能会遇到这样的问题,什么什么bz2 就是提醒我们必须要用bz2  下载一下就可以了。

    make

      编译时间可能会有点长,编译完成之后,执行安装:

    make install

      php的默认安装位置上面已经指定为/usr/local/php,接下来配置相应的文件:

    
     
    1. cp php.ini-development /usr/local/php/lib/php.ini

    2. cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf

    3. ln -s /usr/local/php/sbin/php-fpm /usr/local/bin

      然后设置php.ini,使用: vim /usr/local/php/lib/php.ini 打开php配置文件找到cgi.fix_pathinfo配置项,这一项默认被注释并且值为1,根据官方文档的说明,这里为了当文件不存在时,阻止Nginx将请求发送到后端的PHP-FPM模块,从而避免恶意脚本注入的攻击,所以此项应该去掉注释并设置为0

      

      设置完毕保存并退出

      另外注意一个地方就是php.ini配置文件的位置可以在编译前配置参数中设置,编译参数可以写成:--with-config-file-path=/usr/local/php 这样的话php就回去指定的目录下读取php.ini配置文件,如果不加这个参数默认位置就是php安装目录下的lib目录,具体也可以在phpinfo()输出界面查看,如果php.ini放到其他位置,php读取不到,那么所有的配置修改后都是不生效的,这点要注意

      此时首先应该创建web用户:

    
     
    1. groupadd www-data

    2. useradd -g www-data www-data

      然后网上一些教程说让修改php-fpm.conf添加以上创建的用户和组,这时候使用 vim /usr/local/etc/php-fpm.conf 打开文件后找不到官方所提示的位置:

      

      如果此时随便在一个位置添加,那么接下来启动php-fpm的时候,会报目录找不到的错误,所以不要在php-fpm.conf中添加用户和组,这个时候翻到php-fpm.conf最后一行会发现如下内容(如果编译时添加--prefix选项以下位置会自动补全,默认是下面是空的,要注意):

      

      这里引入了php-fpm.d目录下所有的conf配置文件,但是NONE需要修改为我们的实际目录:/usr/local

      

      默认情况下etc/php-fpm.d/下有一个名为www.conf.defalut的配置用户的文件,执行下面命令复制一个新文件并且打开:

    
     
    1. cp /usr/local/etc/php-fpm.d/www.conf.default /usr/local/etc/php-fpm.d/www.conf

    2. vim /usr/local/etc/php-fpm.d/www.conf

      默认user和group的设置为nobody,将其改为www-data

      

      修改完成之后,保存并退出,然后执行以下命令启动php-fpm服务:

    /usr/local/bin/php-fpm

    启动的php-fpm的时候也有可能出现在一个错误。说我们的配置文件里的引入有问题, 因为我们之前只有一个www.default.conf,但是配置文件中引入的却是*.conf 找不到, 这样的我们复制一个www.default.conf 起一个新名字就叫www.conf就行了。  

    启动完毕之后,php-fpm服务默认使用9000端口,使用 netstat -ntlp | grep 9000 可以查看端口使用情况:

      

      9000端口正常使用,说明php-fpm服务启动成功

      然后执行 vim /usr/local/nginx/nginx.conf 编辑nginx配置文件,具体路径根据实际的nginx.conf配置文件位置编辑,下面主要修改nginx的server {}配置块中的内容,修改location块,追加index.php让nginx服务器默认支持index.php为首页:

      

      然后配置.php请求被传送到后端的php-fpm模块,默认情况下php配置块是被注释的,此时去掉注释并修改为以下内容:

          这里的配置localtion 中,root如果不是默认的目录填上你的项目目录就行。

     

      

      这里面很多都是默认的,root是配置php程序放置的根目录,主要修改的就是fastcgi_param中的/scripts为$document_root

      修改完上面的,回到nginx.conf第一行,默认是#user nobody;  这里要去掉注释改为user www-data;或者user www-data www-data;表示nginx服务器的权限为www-data

      修改完这些保存并退出,然后重启nginx:

    
     
    1. /usr/local/nginx/nginx -s stop

    2. /usr/local/nginx/nginx

      接下来编辑一个测试的php程序,在nginx下的html目录下创建test.php文件,打印一下php配置:

    
     
    1. <?php

    2. phpinfo();

    3. ?>

    展开全文
  • php论坛源码

    2020-07-30 23:31:44
    discuz论坛源码
  • PHP获取网页源码最简单的两种方法

    万次阅读 2018-03-15 10:27:22
    第一种:curl废话不多说,直接上代码//1,获取curl句柄 $ch = curl_init(); // 2. 设置选项,包括URL curl_setopt($ch,CURLOPT_URL,"...); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt(...
  • 最新开源IDC代理PHP源码IDC平源码

    千次阅读 2018-03-27 20:12:05
    最新开源IDC代理PHP源码IDC平源码IDC代理源码是一个以php+mysql进行开发的PHP开源IDC平源码。 1、支持国内多家API接口。 2、支持多家主机控制面板对接功能,如:一键登陆控制面板等。 3、支持云服务器,主机空间...
  • 都是些小程序源码,有的还有后台,适合小白、也适合学过了的、也适合做外包的,要的可以取...https://www.douban.com/group/topic/113284790/o2o微信小程序源码-专门针对o2o类别的小程序源码集合【更新整理中...】ht...
  • 答题小程序源码-前后端源码

    万次阅读 2018-05-26 13:54:57
    答题小程序源码,有人用这个“小程序”每天做100000+流量.代码完全可以跑起来,有前后台代码,数据库是mysql,PHP环境,nginx配置tp做的,在商用。。。第一张图里面就有小程序名称。下载地址:点我 ...
  • 个人网盘源码 本地网盘网站源码

    万次阅读 2019-09-23 20:47:22
    源码介绍: 个人网盘源码 本地网盘网站源码 搭建自己的私有网盘 需要国外空间、服务器 安装环境:PHP≧5.5无需数据库 下载地址1:https://www.lanzous.com/i6cxhcf 下载地址2:...
  • 20个经典Android游戏源码下载地址(持续更新~)

    万次阅读 热门讨论 2013-10-17 20:05:28
    给大家推荐几个,我调试过的Android游戏源码吧!每个我都运行了效果不错哦!希望对喜爱Android开发的朋友们有所帮助。希望大家喜欢。 1.塔防类游戏源码《保卫萝卜》另类玩法 该游戏是一款国外游戏,和...
  • 摘要:后台thinkPHP架构,页面程序双分离,Mysql数据库严谨数据结构、多重数据审核机制、出票机制和监控机制,html5前端技术适用移动端,后台... 系统环境配置要求如一下表格: 系统环境 描述 ...Windows 2008 64位...
  • 求2018整套钓鱼管理系统加源码

    千次阅读 2018-01-04 17:49:05
    求2018整套钓鱼多用户管理系统加各类源码源码比如邮箱,空间,博客。
  • apache无法解析php文件显示源代码

    万次阅读 2012-12-25 15:53:07
    在httpd.conf中添加以下代码即可,  AddHandler php5-script  php  AddType application/x-httpd-php .php .php5  AddType application/x-httpd-php-source .phps
  • 源码是一款非常不错的点餐系统应用,应用源码齐全,运行起来非常不错,基本实现了点餐的一些常用的功能,而且界面设计地也很不错,是一个不错的ios应用学习的例子,喜欢的朋友可以下载学习看看,更多ios源码尽在...
  • 订饭组一个基于php+mysql的外卖订餐网站,包括前端和后台。 源码地址源码演示地址:http://dingfanzu.com商家后台系统:http://dingfanzu.com/admin 测试账号:admin 密码:admin 运行环境:Apache+PHP+Mysql代码...
  • vue.js实战项目17个 包括 电商实战 音乐播放器 团购网 新闻客户端 图书管理 移动端APP 点餐系统 小米阅读开发 商城 vue+Python前后端分离打造电商系统 vue+node构建大型商城 vue+php(laravel5.3)实战等等。...
  • 最新毕业设计网上选题系统(源码,论文) 最新java图书管理系统(源码,论文) 最新毕业设计网上选题系统(源码,论文) 原创vbmd算法的研究与实现-数据存储加密(任务书,论文,源码) 原创pb图书管理系统(任务书,论文,源码)...
  • 抽奖源码(PHP前后台+mysql)

    千次阅读 2019-01-03 21:09:10
    前台页面   后台管理   技术支持微信:x1880161 csdn软件地址:https://download.csdn.net/download/bilichen006/10894206
1 2 3 4 5 ... 20
收藏数 197,074
精华内容 78,829
关键字:

php源码