TPROXY与PHP下的libcurl或http://streams

TPROXY与PHP下的libcurl或http://streams,php,http,sockets,stream,libcurl,Php,Http,Sockets,Stream,Libcurl,我有一个PHP应用程序,在用户和一些HTTP资源之间充当TPROXY,即通过绑定到用户的IP以透明模式设置套接字以进行传出连接: socket_set_option($outgoing_socket, 0 /*SOL_IP*/, 19 /*IP_TRANSPARENT*/, 1); socket_bind($outgoing_socket, $incoming_ip, $incoming_port); 我厌倦了与无效的请求和响应头等HTTP相关的东西作斗争,因此我正在寻找一种更健壮的解决方案,

我有一个PHP应用程序,在用户和一些HTTP资源之间充当TPROXY,即通过绑定到用户的IP以透明模式设置套接字以进行传出连接:

socket_set_option($outgoing_socket, 0 /*SOL_IP*/, 19 /*IP_TRANSPARENT*/, 1);
socket_bind($outgoing_socket, $incoming_ip, $incoming_port);
我厌倦了与无效的请求和响应头等HTTP相关的东西作斗争,因此我正在寻找一种更健壮的解决方案,如libcurl或HTTP://streams,来处理协议通信部分,并将注意力集中在有效负载上

问题出在哪里?我找不到一种方法来为这两种解决方案打开底层套接字的TPROXY模式:

  • 不幸的是,CURLOPT_SOCKOPTFUNCTION似乎不受支持 在libcurl的PHP绑定中
  • 如果不将IP_设置为对套接字透明,http['socket']['bind']上下文将不会接受未分配给当前计算机的IP

有什么办法解决我的问题吗?

有一件事:PHP没有
socket\u setopt
但它有
socket\u set\u选项
@rdlowrey,socket\u setopt是socket\u set\u选项的旧名称,但它仍然作为未记录的别名存在。为了避免混淆,我根据你的建议修改了我的问题。这可能没有多大帮助,但正如你所发现的,PHP在“高级”套接字操作方面很糟糕。实际上,您可以用一种允许您直接访问C-API函数的语言来重写它,而不是使用PHP提供的不完整的包装器。@DaveRandom,我考虑过这一点,但我的内容改编团队(这个代理的实际工作)在PHP方面经验丰富。用PHP开发过滤器也比C/C++快得多。对我来说,用嵌入式PHP创建C/C++守护进程似乎是一种过分的做法。还有一件事——当前PHP实现的性能足够好——它能够在常规硬件上以线速处理千兆流量。@NikolaiGorchilov然后现实地说,您有两个选择:1)坚持纯PHP实现2)用C/C++编写自己的代码,并将其编译为PHP扩展。也许您可以为libcurl编写自己的包装器,或者(更好)使用cURL扩展的现有源代码并添加对
CURLOPT\u SOCKOPTFUNCTION
的支持。这个应用程序需要是可分发的,还是为您控制的特定硬件位编写的?一件事:PHP没有
socket\u setopt
,但它有
socket\u set\u选项
@rdlowrey,socket\u setopt是socket\u set\u选项的旧名称,但它仍然作为未记录的别名存在。为了避免混淆,我根据你的建议修改了我的问题。这可能没有多大帮助,但正如你所发现的,PHP在“高级”套接字操作方面很糟糕。实际上,您可以用一种允许您直接访问C-API函数的语言来重写它,而不是使用PHP提供的不完整的包装器。@DaveRandom,我考虑过这一点,但我的内容改编团队(这个代理的实际工作)在PHP方面经验丰富。用PHP开发过滤器也比C/C++快得多。对我来说,用嵌入式PHP创建C/C++守护进程似乎是一种过分的做法。还有一件事——当前PHP实现的性能足够好——它能够在常规硬件上以线速处理千兆流量。@NikolaiGorchilov然后现实地说,您有两个选择:1)坚持纯PHP实现2)用C/C++编写自己的代码,并将其编译为PHP扩展。也许您可以为libcurl编写自己的包装器,或者(更好)使用cURL扩展的现有源代码并添加对
CURLOPT\u SOCKOPTFUNCTION
的支持。该应用程序是否需要可分发,或者是为您控制的特定硬件位编写的?