本地和服务器上运行不一致如何解决? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lamCJ
V2EX    PHP

本地和服务器上运行不一致如何解决?

  •  
  •   lamCJ 2016 年 3 月 30 日 8170 次点击
    这是一个创建于 3591 天前的主题,其中的信息可能已经有所发展或是发生改变。

    开发机器目前用的是 Win10 ,写项目用的 PHPStrom , XShell 连接 Linux , Xftp 打包上传网站(快换 Git 了...)。

    本地开发 nginx+apache+php+mysql 等版本都比较新,但是服务器端的整个 LNMPA 的版本都不高。

    某些项目在这种差异下几乎没有影响,但是最近服务器环境比较复杂[1]后,本地测试无误后的 PHP 项目上传到服务器上后很多地方出现 500 ,甚至 404[2],路径出错等。

    请问你们 怎么避免 这种问题?以及遇到这种问题的时候 如何快速解决 的?

    或者分享一下你们的不错的 开发&部署 方案? 以及其他 建议

    必须让开发环境和线上环境完全一致吗?

    说明
    • [1] 环境复杂 指的是服务器上使用还有 Java 等项目,目前的解决办法是前台使用 Nginx 反向代理,后端 PHP 依然使用 Apahce 。

    • [2] 404 的问题会受服务器网络速度影响。(公司服务器速度不行...)

    32 条回复    2016-03-31 09:09:35 +08:00
    b821025551b
        1
    b821025551b  
       2016 年 3 月 30 日
    首先统一 php 版本
    Mush
        2
    Mush  
       2016 年 3 月 30 日
    docker 大法好
    ersic
        3
    ersic  
       2016 年 3 月 30 日
    环境一致还经常出错呢,别说环境不一致了,我就经常犯大小写的错误.
    SpicyCat
        4
    SpicyCat  
       2016 年 3 月 30 日
    看你描述都觉得蛋疼。环境问题能解决就不错了,快速解决更可遇不可求。
    开发环境和线上环境最好一致,不然你会遇到无穷无尽的奇怪问题。
    lecher
        5
    lecher  
       2016 年 3 月 30 日   1
    看报错看报错,没有报错日志是查不出来问题的。
    一般 win 下面的文件大小写是不区分的,而 linux 对文件有绝对的大小写区分,所以如果有 windows 下面开发的代码,文件名的命名规范一定要统一好,偷懒就用全小写,不然到线上,为一个大小写的区别, linux 报找不到文件是常有的事。

    线下开发环境搭建一个与线上一致的版本是必须的,至少在上线之前代码放到与线上环境一致的测试环境跑一遍测一测。
    如果线上出问题了,第一反应应该回滚代码,然后把错误日志找出来诊断原因。

    docker 大法确实好,在线上部署对运维能力要求高,但是确实很省开发人员搭建环境的时间。运维把配置脚本写好,开发把需要的安装文件和脚本 copy 过去,运行一下就可以把环境拉起来。
    Orzzzz
        6
    Orzzzz  
       2016 年 3 月 30 日
    Docker 大法好
    lightening
        8
    lightening  
       2016 年 3 月 30 日
    看你要一致到何种程度,以及要方便到什么程度。

    难道你连一个 staging 环境都没有吗?
    lamCJ
        9
    lamCJ  
    OP
       2016 年 3 月 30 日
    @b821025551b 我很想,但是服务器上的版本( CentOS5.11+nginx0.8.55+apache2.2.3+mysql5.09+php5.42 )不是我说了算的,而我本地又想用比较新的开发环境。。 (刚偷偷升级 PHP 至 5.6...)
    lamCJ
        10
    lamCJ  
    OP
       2016 年 3 月 30 日
    @Mush
    @Orzzzz 只听过但从没弄过 Docker ,目前公司也没看出有用这个的意图,有什么推荐的上手资料供研究先么
    UnisandK
        11
    UnisandK  
       2016 年 3 月 30 日   1
    PHPStrom 可以用远程服务器的 php 版本来调试的,本地要搭开发环境肯定是尽量和服务器保持一致
    lamCJ
        12
    lamCJ  
    OP
       2016 年 3 月 30 日
    @SpicyCat 嗯。。。是的

    而且我解决 500 的办法好死板的:在浏览器中找到出现 500 页面,然后再服务器上运行 `php -f 'xxx.php'` 看报错,然后一个个排除。。。
    lhbc
        13
    lhbc  
       2016 年 3 月 30 日
    “[2] 404 的问题会受服务器网络速度影响。(公司服务器速度不行...)”

    这是什么鬼……
    zi
        14
    zi  
       2016 年 3 月 30 日
    @lamCJ 既然服务器版本不是你说了算,为何还要偷偷用新版,自己挖的坑含着泪也要跳下去啊
    特别是有的函数改了、废了,到时候改起来那酸爽简直了。。
    lamCJ
        15
    lamCJ  
    OP
       2016 年 3 月 30 日
    @lightening 当然是少出现 500 404 之类最好了。目前没有走这么标准的流程,你们都有的吗?我才工作不久,这些不是很懂,貌似上面也没这样要求过
    lamCJ
        16
    lamCJ  
    OP
       2016 年 3 月 30 日
    @lhbc 就是慢的时候比如图片会加载失败 用 chrome 审查就是 404 ... 但是复制图片路径单独访问可以看到
    akira
        17
    akira  
       2016 年 3 月 30 日
    @lamCJ 本地多架一个版本的环境来测试不会死人吧
    SpicyCat
        18
    SpicyCat  
       2016 年 3 月 30 日   1
    可以本地用 docker 装个跟线上一样的开发环境,然后代码文件用 volume 挂载。
    damonzheng
        19
    damonzheng  
       2016 年 3 月 30 日
    一定是跟我们一样什么东西都扔在一个 OS 上
    lightening
        20
    lightening  
       2016 年 3 月 30 日   1
    @lamCJ 对。我认为你现在开个 staging 环境,和 production 完全保证一致。并且把本地用的依赖版本都换成和生产环境一样,暂时够用了。

    本地版本都和 production 不一样真是闷声作大死。你目前貌似还不需要用 docker 等工具来达到 100% 一致,但保证各种依赖版本一致实在是太基本的需求了。
    lamCJ
        21
    lamCJ  
    OP
       2016 年 3 月 30 日
    @zi 因为.... 我开始学 php 的时候用的版本就已经不低了 低版本不熟悉....
    lightening
        22
    lightening  
       2016 年 3 月 30 日
    @lamCJ 那你应该升级服务器环境了。要么自己学习低版本,要么升级服务器的 php 。
    lamCJ
        23
    lamCJ  
    OP
       2016 年 3 月 30 日
    @lightening 你们是怎么搭建 staging 环境的呢?(是如果服务器是 centos5.11 那我也得去下载一个 centos5.11 然后在虚拟机里面跑 php 这些,这样吗?)
    lightening
        24
    lightening  
       2016 年 3 月 30 日
    @lamCJ 买一个一模一样的服务器,装一模一样的软件。
    lightening
        25
    lightening  
       2016 年 3 月 30 日
    @lamCJ 也用(几乎)一模一样的部署方法(可能就域名不一样,另外数据是假的)。每次要先部署到 staging 测试一下,然后再部署到 production 。
    lamCJ
        26
    lamCJ  
    OP
       2016 年 3 月 30 日
    @lightening 懂了~ 谢谢
    lhbc
        27
    lhbc  
       2016 年 3 月 30 日
    @lamCJ 再慢也不会 404 啊, nginx 只有在找不到文件的时候才会报 404
    lamCJ
        28
    lamCJ  
    OP
       2016 年 3 月 30 日
    @lhbc 那我也解释不了了,反正现象就是如果在审查工具中看状态码就是 404 ,而直接访问图片 url 却可以看到...

    就是这样:

    ![status code 404]( )

    ![direct access ok]( )

    我也觉得奇怪... 所以我猜可能就是网络不行
    dishuibaby
        29
    dishuibaby  
       2016 年 3 月 30 日   1
    我们是线下有一套与线上代码一致的测试环境。代码放到 svn ,然后开在测试机进行调试。你这样子系统不一致、各种版本不一致。肯定会出问题的。我们现在环境一致,都经常上线的时候出错。紧急回滚。
    zaishanfeng
        30
    zaishanfeng  
       2016 年 3 月 30 日 via Android
    镜像线上环境
    wweir
        31
    wweir  
       2016 年 3 月 30 日
    开发测试环境通过 docker 统一。部署不关我们事,只提供各种脚本
    ppto
        32
    ppto  
       2016 年 3 月 31 日   1
    php 内核代码在线查看工具, www.phpsourcechm.com
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5245 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 09:26 PVG 17:26 LAX 01:26 JFK 04:26
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86