一、启动apache

apachectl start

停止:

apachectl stop

配置文件:

vi /etc/apache2/httpd.conf

一、修改端口

因为80端口不想被占用,80端口还得去弄其他的事情

重启apache

apachectl restart

访问:http://localhost:8405

2启用php
打开文件 sudo vi
/etc/apache2/httpd.conf
找到
#LoadModule php5_module libexec/apache2/libphp5.so 去掉 #

编辑php文件

cp /Library/WebServer/Documents/index.html.en /Library/WebServer/Documents/info.php

修改为:

<html><body><h1>Itiiiiiii works!</h1></body></html>
<?php
    echo phpinfo();
?>

重启apache: apachectl restart

访问如下:

http://localhost:8405/info.php

3 修改DocumentRoot
1) 找到 DocumentRoot
"/Library/WebServer/Documents"
修改
DocumentRoot "[自动的路径]"
2) 找到 <Directory
"/Library/WebServer/Documents">
修改为<Directory
"[上面的路径]">

上面的路径为:/Users/apple/Documents/phpforwuyu

4. 重启apache

apachectl restart

但是这时候我们是不具备访问改目录的权限的

权限没搞好

参考:

http://blog.chinaunix.net/uid-22556372-id-3245808.html

http://www.zhihu.com/question/20854982

http://blog.csdn.net/abeetle/article/details/48731993

http://phpstone.com/php-development-on-mac-os-x/

http://www.cnblogs.com/super-d2/p/4665931.html

http://codeigniter.org.cn/user_guide/

在线升级

http://php-osx.liip.ch/

备注:设置虚拟主机

  1. 在终端运行“sudo vi /etc/apache2/httpd.conf”,打开Apche的配置文件
  2. 在httpd.conf中找到“#Include /private/etc/apache2/extra/httpd-vhosts.conf”,去掉前面的“#”,保存并退出。
  3. 去掉LoadModule vhost_alias_module modules/mod_vhost_alias.so
  4. 运行“sudo apachectl restart”,重启Apache后就开启了虚拟主机配置功能。
  5. 运行“sudo vi /etc/apache2/extra/httpd-vhosts.conf”,就打开了配置虚拟主机文件httpd-vhost.conf,配置虚拟主机了。需要注意的是该文件默认开启了两个作为例子的虚拟主机:
    1. 完整的配置如下httpd.conf:

      #
      # This is the main Apache HTTP server configuration file.  It contains the
      # configuration directives that give the server its instructions.
      # See <URL:http://httpd.apache.org/docs/2.4/> for detailed information.
      # In particular, see
      # <URL:http://httpd.apache.org/docs/2.4/mod/directives.html>
      # for a discussion of each configuration directive.
      #
      # Do NOT simply read the instructions in here without understanding
      # what they do.  They're here only as hints or reminders.  If you are unsure
      # consult the online docs. You have been warned.
      #
      # Configuration and logfile names: If the filenames you specify for many
      # of the server's control files begin with "/" (or "drive:/" for Win32), the
      # server will use that explicit path.  If the filenames do *not* begin
      # with "/", the value of ServerRoot is prepended -- so "logs/access_log"
      # with ServerRoot set to "/usr/local/apache2" will be interpreted by the
      # server as "/usr/local/apache2/logs/access_log", whereas "/logs/access_log"
      # will be interpreted as '/logs/access_log'.
      
      #
      # ServerRoot: The top of the directory tree under which the server's
      # configuration, error, and log files are kept.
      #
      # Do not add a slash at the end of the directory path.  If you point
      # ServerRoot at a non-local disk, be sure to specify a local disk on the
      # Mutex directive, if file-based mutexes are used.  If you wish to share the
      # same ServerRoot for multiple httpd daemons, you will need to change at
      # least PidFile.
      #
      ServerRoot "/usr"
      
      #
      # Mutex: Allows you to set the mutex mechanism and mutex file directory
      # for individual mutexes, or change the global defaults
      #
      # Uncomment and change the directory if mutexes are file-based and the default
      # mutex file directory is not on a local disk or is not appropriate for some
      # other reason.
      #
      # Mutex default:/private/var/run
      
      #
      # Listen: Allows you to bind Apache to specific IP addresses and/or
      # ports, instead of the default. See also the <VirtualHost>
      # directive.
      #
      # Change this to Listen on specific IP addresses as shown below to
      # prevent Apache from glomming onto all bound IP addresses.
      #
      #Listen
      Listen 
      
      #
      # Dynamic Shared Object (DSO) Support
      #
      # To be able to use the functionality of a module which was built as a DSO you
      # have to place corresponding `LoadModule' lines at this location so the
      # directives contained in it are actually available _before_ they are used.
      # Statically compiled modules (those listed by `httpd -l') do not need
      # to be loaded here.
      #
      # Example:
      # LoadModule foo_module modules/mod_foo.so
      #
      LoadModule authn_file_module libexec/apache2/mod_authn_file.so
      #LoadModule authn_dbm_module libexec/apache2/mod_authn_dbm.so
      #LoadModule authn_anon_module libexec/apache2/mod_authn_anon.so
      #LoadModule authn_dbd_module libexec/apache2/mod_authn_dbd.so
      #LoadModule authn_socache_module libexec/apache2/mod_authn_socache.so
      LoadModule authn_core_module libexec/apache2/mod_authn_core.so
      LoadModule authz_host_module libexec/apache2/mod_authz_host.so
      LoadModule authz_groupfile_module libexec/apache2/mod_authz_groupfile.so
      LoadModule authz_user_module libexec/apache2/mod_authz_user.so
      #LoadModule authz_dbm_module libexec/apache2/mod_authz_dbm.so
      #LoadModule authz_owner_module libexec/apache2/mod_authz_owner.so
      #LoadModule authz_dbd_module libexec/apache2/mod_authz_dbd.so
      LoadModule authz_core_module libexec/apache2/mod_authz_core.so
      #LoadModule authnz_ldap_module libexec/apache2/mod_authnz_ldap.so
      LoadModule access_compat_module libexec/apache2/mod_access_compat.so
      LoadModule auth_basic_module libexec/apache2/mod_auth_basic.so
      #LoadModule auth_form_module libexec/apache2/mod_auth_form.so
      #LoadModule auth_digest_module libexec/apache2/mod_auth_digest.so
      #LoadModule allowmethods_module libexec/apache2/mod_allowmethods.so
      #LoadModule file_cache_module libexec/apache2/mod_file_cache.so
      #LoadModule cache_module libexec/apache2/mod_cache.so
      #LoadModule cache_disk_module libexec/apache2/mod_cache_disk.so
      #LoadModule cache_socache_module libexec/apache2/mod_cache_socache.so
      #LoadModule socache_shmcb_module libexec/apache2/mod_socache_shmcb.so
      #LoadModule socache_dbm_module libexec/apache2/mod_socache_dbm.so
      #LoadModule socache_memcache_module libexec/apache2/mod_socache_memcache.so
      #LoadModule watchdog_module libexec/apache2/mod_watchdog.so
      #LoadModule macro_module libexec/apache2/mod_macro.so
      #LoadModule dbd_module libexec/apache2/mod_dbd.so
      #LoadModule dumpio_module libexec/apache2/mod_dumpio.so
      #LoadModule echo_module libexec/apache2/mod_echo.so
      #LoadModule buffer_module libexec/apache2/mod_buffer.so
      #LoadModule data_module libexec/apache2/mod_data.so
      #LoadModule ratelimit_module libexec/apache2/mod_ratelimit.so
      LoadModule reqtimeout_module libexec/apache2/mod_reqtimeout.so
      #LoadModule ext_filter_module libexec/apache2/mod_ext_filter.so
      #LoadModule request_module libexec/apache2/mod_request.so
      #LoadModule include_module libexec/apache2/mod_include.so
      LoadModule filter_module libexec/apache2/mod_filter.so
      #LoadModule reflector_module libexec/apache2/mod_reflector.so
      #LoadModule substitute_module libexec/apache2/mod_substitute.so
      #LoadModule sed_module libexec/apache2/mod_sed.so
      #LoadModule charset_lite_module libexec/apache2/mod_charset_lite.so
      #LoadModule deflate_module libexec/apache2/mod_deflate.so
      #LoadModule xml2enc_module libexec/apache2/mod_xml2enc.so
      #LoadModule proxy_html_module libexec/apache2/mod_proxy_html.so
      LoadModule mime_module libexec/apache2/mod_mime.so
      #LoadModule ldap_module libexec/apache2/mod_ldap.so
      LoadModule log_config_module libexec/apache2/mod_log_config.so
      #LoadModule log_debug_module libexec/apache2/mod_log_debug.so
      #LoadModule log_forensic_module libexec/apache2/mod_log_forensic.so
      #LoadModule logio_module libexec/apache2/mod_logio.so
      LoadModule env_module libexec/apache2/mod_env.so
      #LoadModule mime_magic_module libexec/apache2/mod_mime_magic.so
      #LoadModule expires_module libexec/apache2/mod_expires.so
      LoadModule headers_module libexec/apache2/mod_headers.so
      #LoadModule usertrack_module libexec/apache2/mod_usertrack.so
      ##LoadModule unique_id_module libexec/apache2/mod_unique_id.so
      LoadModule setenvif_module libexec/apache2/mod_setenvif.so
      LoadModule version_module libexec/apache2/mod_version.so
      #LoadModule remoteip_module libexec/apache2/mod_remoteip.so
      LoadModule proxy_module libexec/apache2/mod_proxy.so
      LoadModule proxy_connect_module libexec/apache2/mod_proxy_connect.so
      LoadModule proxy_ftp_module libexec/apache2/mod_proxy_ftp.so
      LoadModule proxy_http_module libexec/apache2/mod_proxy_http.so
      LoadModule proxy_fcgi_module libexec/apache2/mod_proxy_fcgi.so
      LoadModule proxy_scgi_module libexec/apache2/mod_proxy_scgi.so
      #LoadModule proxy_fdpass_module libexec/apache2/mod_proxy_fdpass.so
      LoadModule proxy_wstunnel_module libexec/apache2/mod_proxy_wstunnel.so
      LoadModule proxy_ajp_module libexec/apache2/mod_proxy_ajp.so
      LoadModule proxy_balancer_module libexec/apache2/mod_proxy_balancer.so
      LoadModule proxy_express_module libexec/apache2/mod_proxy_express.so
      #LoadModule session_module libexec/apache2/mod_session.so
      #LoadModule session_cookie_module libexec/apache2/mod_session_cookie.so
      #LoadModule session_dbd_module libexec/apache2/mod_session_dbd.so
      LoadModule slotmem_shm_module libexec/apache2/mod_slotmem_shm.so
      #LoadModule slotmem_plain_module libexec/apache2/mod_slotmem_plain.so
      #LoadModule ssl_module libexec/apache2/mod_ssl.so
      #LoadModule dialup_module libexec/apache2/mod_dialup.so
      LoadModule lbmethod_byrequests_module libexec/apache2/mod_lbmethod_byrequests.so
      LoadModule lbmethod_bytraffic_module libexec/apache2/mod_lbmethod_bytraffic.so
      LoadModule lbmethod_bybusyness_module libexec/apache2/mod_lbmethod_bybusyness.so
      #LoadModule lbmethod_heartbeat_module libexec/apache2/mod_lbmethod_heartbeat.so
      LoadModule unixd_module libexec/apache2/mod_unixd.so
      #LoadModule heartbeat_module libexec/apache2/mod_heartbeat.so
      #LoadModule heartmonitor_module libexec/apache2/mod_heartmonitor.so
      #LoadModule dav_module libexec/apache2/mod_dav.so
      LoadModule status_module libexec/apache2/mod_status.so
      LoadModule autoindex_module libexec/apache2/mod_autoindex.so
      #LoadModule asis_module libexec/apache2/mod_asis.so
      #LoadModule info_module libexec/apache2/mod_info.so
      #LoadModule cgi_module libexec/apache2/mod_cgi.so
      #LoadModule dav_fs_module libexec/apache2/mod_dav_fs.so
      #LoadModule dav_lock_module libexec/apache2/mod_dav_lock.so
      
      LoadModule vhost_alias_module libexec/apache2/mod_vhost_alias.so
      LoadModule negotiation_module libexec/apache2/mod_negotiation.so
      LoadModule dir_module libexec/apache2/mod_dir.so
      #LoadModule imagemap_module libexec/apache2/mod_imagemap.so
      #LoadModule actions_module libexec/apache2/mod_actions.so
      #LoadModule speling_module libexec/apache2/mod_speling.so
      #LoadModule userdir_module libexec/apache2/mod_userdir.so
      LoadModule alias_module libexec/apache2/mod_alias.so
      #LoadModule rewrite_module libexec/apache2/mod_rewrite.so
      LoadModule php5_module libexec/apache2/libphp5.so
      LoadModule hfs_apple_module libexec/apache2/mod_hfs_apple.so
      
      <IfModule unixd_module>
      #
      # If you wish httpd to run as a different user or group, you must run
      # httpd as root initially and it will switch.
      #
      # User/Group: The name (or #number) of the user/group to run httpd as.
      # It is usually good practice to create a dedicated user and group for
      # running httpd, as with most system services.
      #
      User _www
      Group _www
      
      </IfModule>
      
      # 'Main' server configuration
      #
      # The directives in this section set up the values used by the 'main'
      # server, which responds to any requests that aren't handled by a
      # <VirtualHost> definition.  These values also provide defaults for
      # any <VirtualHost> containers you may define later in the file.
      #
      # All of these directives may appear inside <VirtualHost> containers,
      # in which case these default settings will be overridden for the
      # virtual host being defined.
      #
      
      #
      # ServerAdmin: Your address, where problems with the server should be
      # e-mailed.  This address appears on some server-generated pages, such
      # as error documents.  e.g. admin@your-domain.com
      #
      ServerAdmin you@example.com
      
      #
      # ServerName gives the name and port that the server uses to identify itself.
      # This can often be determined automatically, but we recommend you specify
      # it explicitly to prevent problems during startup.
      #
      # If your host doesn't have a registered DNS name, enter its IP address here.
      #
      #ServerName www.example.com:
      
      #
      # Deny access to the entirety of your server's filesystem. You must
      # explicitly permit access to web content directories in other
      # <Directory> blocks below.
      #
      #<Directory />
      #    AllowOverride none
      #    Require all denied
      #</Directory>
      
      #<Directory />
      #    Options Indexes FollowSymLinks
      #    AllowOverride None
      #</Directory>
      
      <Directory />
         # Options FollowSymLinks
          AllowOverride None
          #Order deny,allow
          #Deny from all
          allow from all
          Options All
          #允许所有访问
          #Satisfy all
      </Directory>
      
      #
      # Note that from this point forward you must specifically allow
      # particular features to be enabled - so if something's not working as
      # you might expect, make sure that you have specifically enabled it
      # below.
      #
      
      #
      # DocumentRoot: The directory out of which you will serve your
      # documents. By default, all requests are taken from this directory, but
      # symbolic links and aliases may be used to point to other locations.
      #
      DocumentRoot "/Library/WebServer/Documents"
      <Directory "/Library/WebServer/Documents">
      #DocumentRoot "/Users/apple/Documents/vhost"
      #<Directory "/Users/apple/Documents/vhost">
          #
          # Possible values for the Options directive are "None", "All",
          # or any combination of:
          #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
          #
          # Note that "MultiViews" must be named *explicitly* --- "Options All"
          # doesn't give it to you.
          #
          # The Options directive is both complicated and important.  Please see
          # http://httpd.apache.org/docs/2.4/mod/core.html#options
          # for more information.
          #
          Options FollowSymLinks Multiviews
          MultiviewsMatch Any
      
          #
          # AllowOverride controls what directives may be placed in .htaccess files.
          # It can be "All", "None", or any combination of the keywords:
          #   AllowOverride FileInfo AuthConfig Limit
          #
          #AllowOverride None
          AllowOverride all    
      
          #
          # Controls who can get stuff from this server.
          #
          #Require all granted
          Allow from all
      </Directory>
      
      #
      # DirectoryIndex: sets the file that Apache will serve if a directory
      # is requested.
      #
      <IfModule dir_module>
          DirectoryIndex index.html
      </IfModule>
      
      #
      # The following lines prevent .htaccess and .htpasswd files from being
      # viewed by Web clients.
      #
      <FilesMatch "^\.([Hh][Tt]|[Dd][Ss]_[Ss])">
          Require all denied
      </FilesMatch>
      
      #
      # Apple specific filesystem protection.
      #
      <Files "rsrc">
          Require all denied
      </Files>
      <DirectoryMatch ".*\.\.namedfork">
          Require all denied
      </DirectoryMatch>
      
      #
      # ErrorLog: The location of the error log file.
      # If you do not specify an ErrorLog directive within a <VirtualHost>
      # container, error messages relating to that virtual host will be
      # logged here.  If you *do* define an error logfile for a <VirtualHost>
      # container, that host's errors will be logged there and not here.
      #
      ErrorLog "/private/var/log/apache2/error_log"
      
      #
      # LogLevel: Control the number of messages logged to the error_log.
      # Possible values include: debug, info, notice, warn, error, crit,
      # alert, emerg.
      #
      LogLevel warn
      
      <IfModule log_config_module>
          #
          # The following directives define some format nicknames for use with
          # a CustomLog directive (see below).
          #
          LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
          LogFormat "%h %l %u %t \"%r\" %>s %b" common
      
          <IfModule logio_module>
            # You need to enable mod_logio.c to use %I and %O
            LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
          </IfModule>
      
          #
          # The location and format of the access logfile (Common Logfile Format).
          # If you do not define any access logfiles within a <VirtualHost>
          # container, they will be logged here.  Contrariwise, if you *do*
          # define per-<VirtualHost> access logfiles, transactions will be
          # logged therein and *not* in this file.
          #
          CustomLog "/private/var/log/apache2/access_log" common
      
          #
          # If you prefer a logfile with access, agent, and referer information
          # (Combined Logfile Format) you can use the following directive.
          #
          #CustomLog "/private/var/log/apache2/access_log" combined
      </IfModule>
      
      <IfModule alias_module>
          #
          # Redirect: Allows you to tell clients about documents that used to
          # exist in your server's namespace, but do not anymore. The client
          # will make a new request for the document at its new location.
          # Example:
          # Redirect permanent /foo http://www.example.com/bar
      
          #
          # Alias: Maps web paths into filesystem paths and is used to
          # access content that does not live under the DocumentRoot.
          # Example:
          # Alias /webpath /full/filesystem/path
          #
          # If you include a trailing / on /webpath then the server will
          # require it to be present in the URL.  You will also likely
          # need to provide a <Directory> section to allow access to
          # the filesystem path.
      
          #
          # ScriptAlias: This controls which directories contain server scripts.
          # ScriptAliases are essentially the same as Aliases, except that
          # documents in the target directory are treated as applications and
          # run by the server when requested rather than as documents sent to the
          # client.  The same rules about trailing "/" apply to ScriptAlias
          # directives as to Alias.
          #
          ScriptAliasMatch ^/cgi-bin/((?!(?i:webobjects)).*$) "/Library/WebServer/CGI-Executables/$1"
      
      </IfModule>
      
      <IfModule cgid_module>
          #
          # ScriptSock: On threaded servers, designate the path to the UNIX
          # socket used to communicate with the CGI daemon of mod_cgid.
          #
          #Scriptsock cgisock
      </IfModule>
      
      #
      # "/Library/WebServer/CGI-Executables" should be changed to whatever your ScriptAliased
      # CGI directory exists, if you have that configured.
      #
      <Directory "/Library/WebServer/CGI-Executables">
          AllowOverride None
          Options None
          Require all granted
      </Directory>
      
      <IfModule mime_module>
          #
          # TypesConfig points to the file containing the list of mappings from
          # filename extension to MIME-type.
          #
          TypesConfig /private/etc/apache2/mime.types
      
          #
          # AddType allows you to add to or override the MIME configuration
          # file specified in TypesConfig for specific file types.
          #
          #AddType application/x-gzip .tgz
          #
          # AddEncoding allows you to have certain browsers uncompress
          # information on the fly. Note: Not all browsers support this.
          #
          #AddEncoding x-compress .Z
          #AddEncoding x-gzip .gz .tgz
          #
          # If the AddEncoding directives above are commented-out, then you
          # probably should define those extensions to indicate media types:
          #
          AddType application/x-compress .Z
          AddType application/x-gzip .gz .tgz
      
          #
          # AddHandler allows you to map certain file extensions to "handlers":
          # actions unrelated to filetype. These can be either built into the server
          # or added with the Action directive (see below)
          #
          # To use CGI scripts outside of ScriptAliased directories:
          # (You will also need to add "ExecCGI" to the "Options" directive.)
          #
          #AddHandler cgi-script .cgi
      
          # For type maps (negotiated resources):
          #AddHandler type-map var
      
          #
          # Filters allow you to process content before it is sent to the client.
          #
          # To parse .shtml files for server-side includes (SSI):
          # (You will also need to add "Includes" to the "Options" directive.)
          #
          #AddType text/html .shtml
          #AddOutputFilter INCLUDES .shtml
      </IfModule>
      
      #
      # The mod_mime_magic module allows the server to use various hints from the
      # contents of the file itself to determine its type.  The MIMEMagicFile
      # directive tells the module where the hint definitions are located.
      #
      #MIMEMagicFile /private/etc/apache2/magic
      
      #
      # Customizable error responses come in three flavors:
      # ) plain text ) local redirects ) external redirects
      #
      # Some examples:
      #ErrorDocument  "The server made a boo boo."
      #ErrorDocument  /missing.html
      #ErrorDocument  "/cgi-bin/missing_handler.pl"
      #ErrorDocument  http://www.example.com/subscription_info.html
      #
      
      #
      # MaxRanges: Maximum number of Ranges in a request before
      # returning the entire resource, or one of the special
      # values 'default', 'none' or 'unlimited'.
      # Default setting  Ranges.
      #MaxRanges unlimited
      
      #
      # EnableMMAP and EnableSendfile: On systems that support it,
      # memory-mapping or the sendfile syscall may be used to deliver
      # files.  This usually improves server performance, but must
      # be turned off when serving from networked-mounted
      # filesystems or if support for these functions is otherwise
      # broken on your system.
      # Defaults: EnableMMAP On, EnableSendfile Off
      #
      #EnableMMAP off
      #EnableSendfile on
      
      TraceEnable off
      
      # Supplemental configuration
      #
      # The configuration files in the /private/etc/apache2/extra/ directory can be
      # included to add extra features or to modify the default configuration of
      # the server, or you may simply copy their contents here and change as
      # necessary.
      
      # Server-pool management (MPM specific)
      Include /private/etc/apache2/extra/httpd-mpm.conf
      
      # Multi-language error messages
      #Include /private/etc/apache2/extra/httpd-multilang-errordoc.conf
      
      # Fancy directory listings
      Include /private/etc/apache2/extra/httpd-autoindex.conf
      
      # Language settings
      #Include /private/etc/apache2/extra/httpd-languages.conf
      
      # User home directories
      #Include /private/etc/apache2/extra/httpd-userdir.conf
      
      # Real-time info on requests and configuration
      #Include /private/etc/apache2/extra/httpd-info.conf
      
      # Virtual hosts
      Include /private/etc/apache2/extra/httpd-vhosts.conf
      
      # Local access to the Apache HTTP Server Manual
      #Include /private/etc/apache2/extra/httpd-manual.conf
      
      # Distributed authoring and versioning (WebDAV)
      #Include /private/etc/apache2/extra/httpd-dav.conf
      
      # Various default settings
      #Include /private/etc/apache2/extra/httpd-default.conf
      
      # Configure mod_proxy_html to understand HTML4/XHTML1
      <IfModule proxy_html_module>
      Include /private/etc/apache2/extra/proxy-html.conf
      </IfModule>
      
      # Secure (SSL/TLS) connections
      #Include /private/etc/apache2/extra/httpd-ssl.conf
      #
      # Note: The following must must be present to support
      #       starting without SSL on platforms with no /dev/random equivalent
      #       but a statically compiled-in mod_ssl.
      #
      <IfModule ssl_module>
      SSLRandomSeed startup builtin
      SSLRandomSeed connect builtin
      </IfModule>
      
      Include /private/etc/apache2/other/*.conf
      
      #
      # uncomment out the below to deal with user agents that deliberately
      # violate open standards by misusing DNT (DNT *must* be a specific
      # end-user choice)
      #
      #<IfModule setenvif_module>
      #BrowserMatch "MSIE 10.0;" bad_DNT
      #</IfModule>
      #<IfModule headers_module>
      #RequestHeader unset DNT env=bad_DNT
      #</IfModule>

在终端运行“sudo vi /etc/apache2/httpd.conf”,打开Apche的配置文件

<VirtualHost *:>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot "/usr/docs/dummy-host.example.com"
    ServerName dummy-host.example.com
    ErrorLog "/private/var/log/apache2/dummy-host.example.com-error_log"
    CustomLog "/private/var/log/apache2/dummy-host.example.com-access_log" common
</VirtualHost>

<VirtualHost *:>
    ServerAdmin webmaster@dummy-host2.example.com
    DocumentRoot "/usr/docs/dummy-host2.example.com"
    ServerName dummy-host2.example.com
    ErrorLog "/private/var/log/apache2/dummy-host2.example.com-error_log"
    CustomLog "/private/var/log/apache2/dummy-host2.example.com-access_log" common
</VirtualHost>

而实际上,这两个虚拟主机是不存在的,在没有配置任何其他虚拟主机时,可能会导致访问localhost时出现如下提示:

Forbidden
You don't have permission to access /index.php on this server

最简单的办法就是在它们每行前面加上#,注释掉就好了,这样既能参考又不导致其他问题。

6、增加如下配置(事先得创建好目录:/Users/apple/Documents/vhost/mysites)

<VirtualHost *:>
    DocumentRoot "/Users/apple/Documents/vhost/mysites"
    ServerName mysites
    <Directory />
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order deny,allow
                Allow from all
      </Directory>
</VirtualHost>

7、运行“sudo vi /etc/hosts”,打开hosts配置文件,加入"127.0.0.1 mysites",这样就可以配置完成sites虚拟主机了,可以访问“http://mysites”了

8、重启apache:

sudo apachectl restart

访问:http://mysites:8405/

效果如下:

ok测试成功

备注:使用CodeIgniter框架开发应用

一、在apache的根目录:/Library/WebServer/Documents,下拉取代码:
git clone https://github.com/bcit-ci/CodeIgniter.git
访问:

http://localhost:8405/CodeIgniter/

如图:

新建数据库与表

CREATE databases ciblog;

CREATE TABLE `users` (
  `id` ) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar() DEFAULT NULL,
  `nickname` varchar() DEFAULT NULL,
  `password` varchar() DEFAULT NULL,
  `email` varchar() DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8;

CREATE TABLE `posts` (
  `uid` ) unsigned NOT NULL AUTO_INCREMENT,
  `title` varchar() DEFAULT NULL,
  `time` datetime DEFAULT NULL,
  `content` varchar() DEFAULT NULL,
  `catetory` varchar() DEFAULT NULL,
  `tag` varchar() DEFAULT NULL,
  `type` ) DEFAULT NULL,
  `pid` ) DEFAULT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8;

CREATE TABLE `admin_user` (
  `uid` ) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `username` ) NOT NULL DEFAULT '' COMMENT '用户名',
  `password` ) NOT NULL DEFAULT '' COMMENT '密码',
  `salt` ) NOT NULL DEFAULT '' COMMENT '密码SALT',
  `type` tinyint() unsigned NOT NULL DEFAULT ' COMMENT '1-超级管理员, 2-管理员, 3-用户',
  `state` tinyint() unsigned NOT NULL DEFAULT ' COMMENT '1-正常, 2-禁止登陆',
  `register_time` datetime NOT NULL COMMENT '注册时间',
  `last_login_time` datetime NOT NULL COMMENT '最后登入次数',
  `last_login_ip` ) unsigned DEFAULT ' NULL COMMENT '最后登陆IP',
  `login_count` ) unsigned NOT NULL DEFAULT ' COMMENT '登入次数',
  PRIMARY KEY (`uid`),
  UNIQUE KEY `username` (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='管理用户表';

插入数据:

INSERT INTO `posts` (`uid`, `title`, `time`, `content`, `catetory`, `tag`, `type`, `pid`)
VALUES
    (, , ),
    (, , );

INSERT INTO `users` (`id`, `username`, `nickname`, `password`, `email`)
VALUES
    (, 'zxww', 'zcw', 'zcw', 'zcw'),
    (,  ');

控制器:

post.php

<?php
class Post extends CI_Controller {
  public function __construct() {
     parent::__construct();
  }
  public function create() {
    $this->load->model('post_model');
    $this->load->helper('form');
    $this->load->helper('url');
    $this->load->library('form_validation');
    if(!$this->session->userdata('logged_in')) {
      redirect('/');
    }
    $this->form_validation->set_rules('title','Title','required|xss_clean');
    $this->form_validation->set_rules('content','Content','required|xss_clean');
    $this->form_validation->set_rules('catetory','Catetory','required|xss_clean');
    $this->form_validation->set_rules('tag','Tag','required|xss_clean');

    if($this->form_validation->run() === FALSE) {
      $data['title'] = "Create Post";
      $this->load->view('templates/header',$data);
      $this->load->view('post/create');
      $this->load->view('templates/footer');
    } else {
      $this->post_model->create_post();
      // $this->load->view('post/create-success');
      redirect('/');
    }
  }
  public function update($pid = FALSE) {
    $this->load->model('post_model');
    $this->load->helper('form');
    $this->load->library('form_validation');
    $this->load->helper('url');
    if($pid === FALSE) {
      redirect('/');
    }
    $current = $this->session->userdata('uid');
    $data['post'] = $this->post_model->get_post($pid);
    if($data['post']->uid !== $current) {
      redirect('/');
    }
    $this->form_validation->set_rules('title','Title','required|xss_clean');
    $this->form_validation->set_rules('content','Content','required|xss_clean');
    $this->form_validation->set_rules('catetory','Catetory','required|xss_clean');
    $this->form_validation->set_rules('tag','Tag','required|xss_clean');

    if($this->form_validation->run() === FALSE) {
      $data['title'] = "Update Post";
      $this->load->view('templates/header',$data);
      $this->load->view('post/update',$data);
      $this->load->view('templates/footer');
    } else {
      $this->post_model->update_post($pid);
      redirect('/view/'.$data['post']->pid);
    }
  }
  public function view($pid = FALSE) {
    $this->load->model('post_model');
    $this->load->helper('date');
    if($pid === FALSE) {
      redirect('/');
      // $data['posts'] = $this->post_model->get_post();
      // $this->load->view('post/index',$data);
    } else {
      $data['post'] = $this->post_model->get_post($pid);
      $data['title'] = $data['post']->title;
      $this->load->view('templates/header',$data);
      $this->load->view('post/view',$data);
    }
    $this->load->view('templates/footer');
  }
  public function plist($p = FALSE) {
    $this->load->model('post_model');
    if($p === FALSE) {
      $data['posts'] = $this->post_model->get_list_post();
      $data[;
    } else {
      $data['posts'] = $this->post_model->get_list_post($p);
      $data['current_page'] = $p;
    }
    $data['title'] = 'Post List';
    $data['total_rows'] = $this->post_model->get_post_nums();

    $this->load->view('templates/header',$data);
    $this->load->view('post/index',$data);
    $this->load->view('templates/footer');
  }
  public function delete($pid = FALSE) {
    $this->load->model('post_model');
    $this->load->helper('url');
    $current = $this->session->userdata('uid');
    $data['post'] = $this->post_model->get_post($pid);
    if($data['post']->uid !== $current) {
      redirect('/');
    }
    if($pid !== FALSE) {
      $this->post_model->delete_post($pid);
      redirect('/','refresh');
    }
  }
}

user.php

<?php
class User extends CI_Controller {
  public function __construct() {
    parent::__construct();
    // $this->load->model('user');
  }
  public function login() {
    $this->load->helper('form');
    $this->load->helper('url');
    $this->load->library('form_validation');
    if($this->session->userdata('logged_in')){
      redirect('/');
    }
    // 这里要判断是否已经登录
    $this->form_validation->set_rules('username','Username','trim|required|xss_clean');
    $this->form_validation->set_rules('password','Password','md5');
    $data['title'] = "Login";
    if($this->form_validation->run() === FALSE) {
      $this->load->view('templates/header',$data);
      $this->load->view('user/login');
      $this->load->view('templates/footer');
    } else {
      $username = $this->input->post('username');
      $password = $this->input->post('password');
      $result = $this->user_model->get_user($username);
      if($result && $password == $result->password) {
        $this->load->view('user/login-success');
        $this->session->set_userdata('uid',$result->id);
        $this->session->set_userdata('username',$result->username);
        $this->session->set_userdata('nickname',$result->nickname);
        $this->session->set_userdata('email',$result->email);
        $this->session->set_userdata('logged_in',TRUE);
        redirect('/');
      } else {
        $this->form_validation->set_message('username or password error');
        $this->load->view('templates/header',$data);
        $this->load->view('user/login');
        $this->load->view('templates/footer');
      }
    }
  }
  public function register() {
    $this->load->helper('form');
    $this->load->helper('url');
    $this->load->library('form_validation');
    $this->form_validation->set_rules('username','Username','trim|required|xss_clean|is_unique[users.username]');
    $this->form_validation->set_rules('password','Password','trim|required|mathes[passconf]|md5');
    $this->form_validation->set_rules('passconf','Password Confirmation','required');
    $this->form_validation->set_rules('email','Email','required|is_unique[users.email]');
    if($this->form_validation->run() === FALSE) {
      $data['title'] = "Register";
      $this->load->view('templates/header',$data);
      $this->load->view('user/register');
      $this->load->view('templates/footer');
    } else {
      $this->user_model->create_user();
      redirect('/login');
    }
  }
  public function logout() {
    $this->session->unset_userdata('uid');
    $this->session->unset_userdata('username');
    $this->session->unset_userdata('nickname');
    $this->session->unset_userdata('email');
    $this->session->set_userdata('logged_in',FALSE);
    redirect('/');
  }
}

视图:

index.php

<h2>Post List</h2>
<ul class="list">

  <?php foreach($posts as $post) :?>
  <li class="item">
    <h3>
      <a href="./view/<?php echo $post->pid; ?>">
        <?php echo $post->title ?>
      </a>
    </h3>
    <small>
      <?php echo $post->nickname; ?>
    </small>
    <div class="content">
      <?php echo $post->content; ?>
    </div>
  </li>
  <?php endforeach ?>
</ul>
<nav>
  <?php
  ; $i <= intval($total_rows/); $i++) {
    if($i == $current_page) {
      echo )."</a>";
    } elseif($i==) {
      echo "<a href='".page_url()."'>1</a>";
    } else {
      echo )."</a>";
    }

  }
  ?>
</nav>

模型:

post_model.php

<?php

class Post_model extends CI_Model {
  public function __construct() {
    $this->load->database();
  }

  public function create_post() {
    $this->load->helper('date');

    $data = array(
      'title' => $this->input->post('title'),
      'uid' => $this->session->userdata('uid'),
      'time' => now(),
      'content' => $this->input->post('content'),
      'catetory' => $this->input->post('catetory'),
      'tag' => $this->input->post('tag'),
      'type' => $this->input->post('type')
    );

    return $this->db->insert('posts',$data);
  }

  public function get_post($pid = FALSE) {
    $this->db->select('*');
    $this->db->from('posts');
    $this->db->join('users','users.id = posts.uid');

    if($pid === FALSE) {
      $this->db->order_by('pid desc');
      $query = $this->db->get();
      return $query->result();
    }

    $this->db->where('pid',$pid);
    $query = $this->db->get();
    return $query->row();
  }

  public function get_list_post($p = FALSE) {
    $this->db->select('*');
    $this->db->from('posts');
    $this->db->join('users','users.id = posts.uid');
    $this->db->order_by('pid desc');

    if($p === FALSE) {
      $);
    } else {
      $+,$p*);
    }

    $query = $this->db->get();
    return $query->result();
  }

  public function get_post_nums() {
    $this->db->select('*');
    $this->db->from('posts');
    $this->db->join('users','users.id = posts.uid');
    $this->db->order_by('pid desc');

    return $this->db->count_all_results();
  }

  public function update_post($pid = FALSE) {
    if($pid === FALSE) {
      return FALSE;
    }
    $this->load->helper('date');

    $data = array(
      'title' => $this->input->post('title'),
      'time' => now(),
      'content' => $this->input->post('content'),
      'catetory' => $this->input->post('catetory'),
      'tag' => $this->input->post('tag'),
      'type' => $this->input->post('type')
    );

    return $this->db->update('posts',$data,array('pid'=>$pid));
  }

  public function delete_post($pid = FALSE) {
    if($pid === FALSE) {
      return FALSE;
    }
    $this->load->helper('url');

    return $this->db->delete('posts',array('pid'=>$pid));
  }
} 

user_model.php

<?php

class User_model extends CI_Model {
  public function __construct() {
    $this->load->database();
  }

  public function create_user() {

    $data = array(
      'username' => $this->input->post('username'),
      'nickname' => $this->input->post('nickname'),
      'password' => $this->input->post('password'),
      'email' => $this->input->post('email')
    );

    return $this->db->insert('users',$data);
  }

  public function get_user($username = FALSE) {
    if($username == FALSE) {
      return false;
    }

    $query = $this->db->get_where('users',array('username'=>$username));
    return $query->row();
  }
}

database.php

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

/*
| -------------------------------------------------------------------
| DATABASE CONNECTIVITY SETTINGS
| -------------------------------------------------------------------
| This file will contain the settings needed to access your database.
|
| For complete instructions please consult the 'Database Connection'
| page of the User Guide.
|
| -------------------------------------------------------------------
| EXPLANATION OF VARIABLES
| -------------------------------------------------------------------
|
|    ['dsn']      The full DSN string describe a connection to the database.
|    ['hostname'] The hostname of your database server.
|    ['username'] The username used to connect to the database
|    ['password'] The password used to connect to the database
|    ['database'] The name of the database you want to connect to
|    ['dbdriver'] The database driver. e.g.: mysqli.
|            Currently supported:
|                 cubrid, ibase, mssql, mysql, mysqli, oci8,
|                 odbc, pdo, postgre, sqlite, sqlite3, sqlsrv
|    ['dbprefix'] You can add an optional prefix, which will be added
|                 to the table name when using the  Query Builder class
|    ['pconnect'] TRUE/FALSE - Whether to use a persistent connection
|    ['db_debug'] TRUE/FALSE - Whether database errors should be displayed.
|    ['cache_on'] TRUE/FALSE - Enables/disables query caching
|    ['cachedir'] The path to the folder where cache files should be stored
|    ['char_set'] The character set used in communicating with the database
|    ['dbcollat'] The character collation used in communicating with the database
|                 NOTE: For MySQL and MySQLi databases, this setting is only used
|                  as a backup if your server is running PHP < 5.2.3 or MySQL < 5.0.7
|                 (and in table creation queries made with DB Forge).
|                  There is an incompatibility in PHP with mysql_real_escape_string() which
|                  can make your site vulnerable to SQL injection if you are using a
|                  multi-byte character set and are running versions lower than these.
|                  Sites using Latin-1 or UTF-8 database character set and collation are unaffected.
|    ['swap_pre'] A default table prefix that should be swapped with the dbprefix
|    ['encrypt']  Whether or not to use an encrypted connection.
|
|            'mysql' (deprecated), 'sqlsrv' and 'pdo/sqlsrv' drivers accept TRUE/FALSE
|            'mysqli' and 'pdo/mysql' drivers accept an array with the following options:
|
|                'ssl_key'    - Path to the private key file
|                'ssl_cert'   - Path to the public key certificate file
|                'ssl_ca'     - Path to the certificate authority file
|                'ssl_capath' - Path to a directory containing trusted CA certificats in PEM format
|                'ssl_cipher' - List of *allowed* ciphers to be used for the encryption, separated by colons (':')
|                'ssl_verify' - TRUE/FALSE; Whether verify the server certificate or not ('mysqli' only)
|
|    ['compress'] Whether or not to use client compression (MySQL only)
|    ['stricton'] TRUE/FALSE - forces 'Strict Mode' connections
|                            - good for ensuring strict SQL while developing
|    ['ssl_options']    Used to set various SSL options that can be used when making SSL connections.
|    ['failover'] array - A array with 0 or more data for connections if the main should fail.
|    ['save_queries'] TRUE/FALSE - Whether to "save" all executed queries.
|                 NOTE: Disabling this will also effectively disable both
|                 $this->db->last_query() and profiling of DB queries.
|                 When you run a query, with this setting set to TRUE (default),
|                 CodeIgniter will store the SQL statement for debugging purposes.
|                 However, this may cause high memory usage, especially if you run
|                 a lot of SQL queries ... disable this to avoid that problem.
|
| The $active_group variable lets you choose which connection group to
| make active.  By default there is only one group (the 'default' group).
|
| The $query_builder variables lets you determine whether or not to load
| the query builder class.
*/
$active_group = 'default';
$query_builder = TRUE;

$db['default'] = array(
    'dsn'    => '',
    'hostname' => '192.168.1.109',
    'username' => 'zhenchaowen',
    'password' => 'zhenchaowen',
    'database' => 'ciblog',
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => (ENVIRONMENT !== 'production'),
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
);

访问

http://mysites:8405/CodeIgniter/

如图:

源码:

https://github.com/super-d2/codeigniter_demo

参考:

http://www.ibm.com/developerworks/cn/web/wa-codeigniter/

mac下php开发环境搭建+CI框架使用的更多相关文章

  1. mac下java 开发环境搭建

    mac配置java开发环境: jdk1.7 +sdk1.7+maven +tomcat   1.先安装jdk ,才能安装sdk . 2 mac中jdk1.7的默认位置:/Library/Java/Ja ...

  2. 【VUE】Mac下vue 开发环境搭建,以及目录结构

    1 安装Node.js 参看 node.js环境安装   http://www.cnblogs.com/richerdyoung/p/7265786.html 2 安装淘宝镜像 npm install ...

  3. mac下Android开发环境搭建

    之前一段时间在学习ios的开发,近一段时间想着也接触下Android开发,以来加深对移动端开发的理解.这里根据自己配置Android开发环境的过程,比较详细的来总结下自己的安装过程,希望对一些正准备配 ...

  4. Mac下JAVA开发环境搭建

    最近开始学习JAVA, 首先配置下环境! 1.Mac自带的jdk版本老了,需要到oracle官网去下载新的jdk,具体下载那个版本看个人需求,然后安装.   安装完成之后打开Terminal, 执行命 ...

  5. Mac下Cordova开发环境搭建

    xcode下载 从Mac App Store 下载Xcode,只需要在Store键入Xcode,下载第一个就ok了 cordova安装与配置 cordova需要node安装,使用Safari打开nod ...

  6. Mac下R语言环境搭建

    Mac下R语言环境搭建 博主在数据分析的时候一直用的python(MATLAB太重了),最近跟其他搞学术的人合作,需要用一下R语言,所以也打算顺便学习一下R. R语言简介 R语言是用于统计分析,图形表 ...

  7. OpenCV学习系列(零) Mac下OpenCV + xcode环境搭建

    # OpenCV学习系列(零) Mac下OpenCV + xcode环境搭建 [-= 博客目录 =-] 1-学习目标 1.1-本章介绍 1.2-实践内容 1.3-相关说明 2-学习过程 2.1-hom ...

  8. Windows 7 下 PHP 开发环境搭建(手动)

    Windows 7 下 PHP 开发环境搭建 1.说明 做开发的都知道一句话,就是“站在巨人的肩膀上”.确实现在打开浏览器随便一搜很多一键安装PHP环境的软件,比如wamp.xampp.AppServ ...

  9. NDK在windows下的开发环境搭建及开发过程

    在Android应用的开发工程中,不管是游戏还是普通应用,都时常会用到.so即动态链接库,关于.so是什么玩意儿,有什么好处,这个大家可以在网上查一下,本人不做过多解释..so本是linux下的文件类 ...

随机推荐

  1. 关闭CENTOS不必要的默认服务

    CentOS关闭服务的方法: 图形界面,运行ntsysv chkconfig –level 2345 服务名称 off 服務名稱 建議 說明 acpid 停用 Advanced Configurati ...

  2. 一致性哈希算法以及其PHP实现

    在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括:  轮循算法(Round Robin).哈希算法(HASH).最少连接算法(Least Connection).响应速度算法(Respons ...

  3. js手机网页跳转

    在网页头部加入如下代码: <script type="text/javascript"> function browserRedirect() { var sUserA ...

  4. We will be discontinuing the Nitrous Development Platform and Cloud IDE on November 14th, 2016.

    我表示我很难过 Nitrous We will be discontinuing the Nitrous Development Platform and Cloud IDE on November ...

  5. 【leetcode】Excel Sheet Column Title

    Excel Sheet Column Title Given a non-zero positive integer, return its corresponding column title as ...

  6. 基于Hadoop 2.6.0运行数字排序的计算

    上个博客写了Hadoop2.6.0的环境部署,下面写一个简单的基于数字排序的小程序,真正实现分布式的计算,原理就是对多个文件中的数字进行排序,每个文件中每个数字占一行,排序原理是按行读取后分块进行排序 ...

  7. HTTP协议与HTML表单(再谈GET与POST的区别)

    HTTP的GET/POST方式有何区别?这是一个老生常谈的问题,但老生常谈的问题往往有一些让人误解的结论.本文将带您浅尝HTTP协议,在了 解HTTP协议的同时将会展示许多被人们忽视的内容.在掌握了H ...

  8. CocoaPods安装教程

    Code4App 原创文章.转载请注明出处:http://code4app.com/article/cocoapods-install-usage CocoaPods是什么? 当你开发iOS应 用时, ...

  9. Ubuntu(Linux)使用Eclipse搭建C/C++编译环境

    转自:http://www.cppblog.com/kangnixi/archive/2010/02/10/107636.html 首先是安装Eclipse,方法有两种:       第一种是通过Ub ...

  10. App Store审核被拒的23个理由

    原文地址 iOS 应用提交审核要持续一周或者更久,在提交之前,我们一定要进行「自我审查」,避免被拒.ASO100 为大家收集整理了2015年 App Store 审核被拒的23个理由,并且附上官方拒绝 ...