diff --git a/dec_interceptor/dec_interceptor.c b/dec_interceptor/dec_interceptor.c index e33248bf..d2911cd6 100644 --- a/dec_interceptor/dec_interceptor.c +++ b/dec_interceptor/dec_interceptor.c @@ -2,6 +2,7 @@ #include "php_ini.h" #include "ext/standard/info.h" #include "php_dec_interceptor.h" +#include "main/php_streams.h" // ✅ 必须包含,用于 php_stream 结构 static zend_op_array* (*original_compile_file)(zend_file_handle *file_handle, int type); @@ -15,7 +16,7 @@ static zend_op_array* custom_compile_file(zend_file_handle *file_handle, int typ char *buffer = NULL; size_t size = 0; - // ✅ 情况1:标准文件句柄(明文 PHP 文件) + // ✅ 情况1:标准文件句柄 if (file_handle->type == ZEND_HANDLE_FP && file_handle->handle.fp) { FILE *fp = file_handle->handle.fp; fseek(fp, 0, SEEK_END); @@ -28,19 +29,23 @@ static zend_op_array* custom_compile_file(zend_file_handle *file_handle, int typ buffer[size] = '\0'; } - // ✅ 情况2:stream(Swoole 加密文件,通过 swoole_loader 解密) - } else if (file_handle->type == ZEND_HANDLE_STREAM && file_handle->handle.stream.reader) { - zend_stream_handle *stream = &file_handle->handle.stream; - size = stream->handle.len; + // ✅ 情况2:stream 句柄(swoole_loader 加密文件解密后走这个分支) + } else if (file_handle->type == ZEND_HANDLE_STREAM && file_handle->handle.stream.handle) { + php_stream *stream = (php_stream *)file_handle->handle.stream.handle; + + php_stream_seek(stream, 0, SEEK_END); + size = php_stream_tell(stream); + php_stream_seek(stream, 0, SEEK_SET); + if (size > 0 && size < 100 * 1024 * 1024) { buffer = emalloc(size + 1); - size_t read_bytes = stream->reader(stream, buffer, size); + size_t read_bytes = php_stream_read(stream, buffer, size); buffer[read_bytes] = '\0'; size = read_bytes; } } - // ✅ 如果成功读取内容,保存为 .dec.php 文件 + // ✅ 保存为 .dec.php if (buffer && size > 0) { char output_path[PATH_MAX]; snprintf(output_path, sizeof(output_path), "%s.dec.php", source_path); @@ -58,7 +63,6 @@ static zend_op_array* custom_compile_file(zend_file_handle *file_handle, int typ } } - // 调用原始 Zend 编译器 return original_compile_file(file_handle, type); }