免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3680 | 回复: 16

求助. apache @INC 不能修改 [复制链接]

论坛徽章:
0
发表于 2012-11-26 10:15 |显示全部楼层
   最近我在尝试使用apapche发布webservice服务, 其中有几个自己定义的包需要引用.但是调用的时候总是报下面错误
  1. SOAP::Transport::HTTP::Client::send_receive: HTTP::Response=HASH(0x17000fa8)
  2. SOAP::Transport::HTTP::Client::send_receive: HTTP/1.1 500 Internal Server Error
  3. Connection: close
  4. Date: Mon, 26 Nov 2012 14:18:38 GMT
  5. Server: Apache/2.2.23 (Unix) mod_perl/2.0.7 Perl/v5.16.2
  6. Content-Length: 736
  7. Content-Type: text/xml; charset=utf-8
  8. Client-Date: Mon, 26 Nov 2012 14:18:39 GMT
  9. Client-Peer: 172.30.35.29:10000
  10. Client-Response-Num: 1
  11. SOAPServer: SOAP::Lite/Perl/0.715

  12. <?xml version="1.0" encoding="UTF-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><soap:Fault><faultcode>soap:Client</faultcode><faultstring>Failed to access class (XmlData): Can't locate ORG/ILLIDAN/CFGPARSER.pm in @INC (@INC contains: /usr/httpd/cgi-bin) at /usr/httpd/cgi-bin/XmlData.pm line 6.
  13. BEGIN failed--compilation aborted at /usr/httpd/cgi-bin/XmlData.pm line 6.
  14. Compilation failed in require at (eval 94) line 2.
  15. </faultstring></soap:Fault></soap:Body></soap:Envelope>
复制代码
找不到对应的模块.查询mod_perl后发现需要在apache服务器启动的配置文件中添加
  1. PerlRequire /usr/httpd/conf/start.pl
复制代码
然后建立start.pl文件
  1. use lib qw(. /usr/httpd/cgi-bin /usr/local/lib/perl5/site_perl/5.16.2);

  2. 1;
复制代码
重起服务器后问题依旧.请大虾帮我分析下哪里设置的不对.

论坛徽章:
0
发表于 2012-11-26 14:37 |显示全部楼层
后续测试,在startup.pl中打印@INC
  1. use Data::Dumper;
  2. print "*********执行启动脚本!\n";\
  3. print Dumper(\@INC);
  4. 1;
复制代码
重起apache服务器显示
  1. *********执行启动脚本!
  2. $VAR1 = [
  3.           '/usr/local/lib/perl5/site_perl/5.16.2/x86_64-linux-thread-multi',
  4.           '/usr/local/lib/perl5/site_perl/5.16.2',
  5.           '/usr/local/lib/perl5/5.16.2/x86_64-linux-thread-multi',
  6.           '/usr/local/lib/perl5/5.16.2',
  7.           '.',
  8.           '/usr/httpd'
  9.         ];
复制代码
说明在未添加任务路径的情况下,在apache启动的时候@INC保存了系统中的路径.

但是为什么在执行调用的时候,却显示
  1. Can't locate ORG/ILLIDAN/CFGPARSER.pm in @INC (@INC contains: /usr/httpd/cgi-bin)
复制代码
显然,在执行调用的时候@INC变成了
/usr/httpd/cgi-bin

请问这是为什么呢?

论坛徽章:
0
发表于 2012-11-26 15:28 |显示全部楼层
前面使用的是动态调用
  1. #!/usr/bin/perl  
  2. use strict;
  3. use warnings;

  4. use SOAP::Transport::HTTP;
  5. SOAP::Transport::HTTP::CGI->dispatch_to('/usr/httpd/cgi-bin')->handle;
复制代码
修改成静态调用后成功运行
  1. #!/usr/bin/perl  
  2. use strict;
  3. use warnings;

  4. use SOAP::Transport::HTTP;

  5. SOAP::Transport::HTTP::CGI->dispatch_to('XmlData')-> handle;
复制代码
原因目前还不清楚...

论坛徽章:
0
发表于 2012-11-27 00:05 |显示全部楼层
系统有多个perl?

论坛徽章:
0
发表于 2012-11-27 09:40 |显示全部楼层
回复 4# sjdy521

只有一个.
   

论坛徽章:
0
发表于 2012-11-27 10:30 |显示全部楼层
把@INC 用tie绑定一下,然后捕获一下到底谁在修改它

论坛徽章:
0
发表于 2012-11-27 15:19 |显示全部楼层
看看是否启用了taint 模式了, 就是看看  文件第一行 是否含有-T, 类似这样  #!/usr/bin/perl  -T

如果启用了taint模式了,perl 会忽略掉apache传递给@INC的路径的。
我遇到过一回, 去掉taint模式, 路径就就能正常使用了

论坛徽章:
0
发表于 2012-11-28 09:43 |显示全部楼层
sjdy521 发表于 2012-11-27 10:30
把@INC 用tie绑定一下,然后捕获一下到底谁在修改它


怎么做呢,能不能具体一点.

论坛徽章:
0
发表于 2012-11-28 09:43 |显示全部楼层
climby 发表于 2012-11-27 15:19
看看是否启用了taint 模式了, 就是看看  文件第一行 是否含有-T, 类似这样  #!/usr/bin/perl  -T

如果启 ...


没有启用

论坛徽章:
0
发表于 2012-11-28 11:18 |显示全部楼层
本帖最后由 兰花仙子 于 2012-11-28 11:18 编辑

上个月刚帮朋友公司写了个modperl项目

startup.pl内容:

use strict;
use lib '/etc/apache2/modperl';
use Apache2::RequestRec ();
use Apache2::RequestIO ();
use Apache2::Connection ();
use Apache2::Request;
use Digest::MD5 'md5_hex';
use Socket;
use JSON;
use Data::Validate::IP qw(is_ipv4);
use Siteconf;

1;

Siteconf.pm就是项目配置文件,放在/etc/apache2/modperl下。

httpd.conf里虚拟主机的配置:
        PerlModule Apache::DBI
        PerlPostConfigRequire /etc/apache2/modperl/startup.pl

        <Location /xxx/>
            SetHandler modperl
            PerlResponseHandler MyHandler1
        </Location>

        <Location /yyy/>
            SetHandler modperl
            PerlResponseHandler MyHandler2
        </Location>

MyHandler1和2是apache handler,不同的目录使用不同的handler。

All works fine with pretty good performance. You may just give another try.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP