Automattic\WooCommerce\Internal\Admin\Logging\FileV2
FileController::search_within_files
Search within a set of log files for a particular string.
Метод класса: FileController{}
Хуков нет.
Возвращает
Массив|int|WP_Error. When matches are found, each array item is an associative array that includes the file ID, line number, and the matched string with HTML markup around the matched parts.
Использование
$FileController = new FileController(); $FileController->search_within_files( $search, $args, $file_args, $count_only );
- $search(строка) (обязательный)
- The string to search for.
- $args(массив)
- Arguments for pagination of search results.
По умолчанию:array() - $file_args(массив)
- Arguments to filter and sort the files that are returned. See get_files().
По умолчанию:array() - $count_only(true|false)
- True to return a total count of the matches.
По умолчанию:false
Код FileController::search_within_files() FileController::search within files WC 10.5.2
public function search_within_files( string $search, array $args = array(), array $file_args = array(), bool $count_only = false ) {
if ( '' === $search ) {
return $count_only ? 0 : array();
}
$search = esc_html( $search );
$args = wp_parse_args( $args, self::DEFAULTS_SEARCH_WITHIN_FILES );
$file_args = array_merge(
$file_args,
array(
'offset' => 0,
'per_page' => self::SEARCH_MAX_FILES,
)
);
$cache_key = WC_Cache_Helper::get_prefixed_key( self::SEARCH_CACHE_KEY, self::CACHE_GROUP );
$query = wp_json_encode( array( $search, $args, $file_args ) );
$cache = wp_cache_get( $cache_key );
$is_cached = isset( $cache['query'], $cache['results'] ) && $query === $cache['query'];
if ( true === $is_cached ) {
$matched_lines = $cache['results'];
} else {
$files = $this->get_files( $file_args );
if ( is_wp_error( $files ) ) {
return $files;
}
// Max string size * SEARCH_MAX_RESULTS = ~1MB largest possible cache entry.
$max_string_size = 5 * KB_IN_BYTES;
$matched_lines = array();
foreach ( $files as $file ) {
$stream = $file->get_stream();
$line_number = 1;
while ( ! feof( $stream ) ) {
$line = fgets( $stream, $max_string_size );
if ( ! is_string( $line ) ) {
continue;
}
$sanitized_line = esc_html( trim( $line ) );
if ( false !== stripos( $sanitized_line, $search ) ) {
$matched_lines[] = array(
'file_id' => $file->get_file_id(),
'line_number' => $line_number,
'line' => $sanitized_line,
);
}
if ( count( $matched_lines ) >= self::SEARCH_MAX_RESULTS ) {
$file->close_stream();
break 2;
}
if ( false !== strstr( $line, PHP_EOL ) ) {
$line_number ++;
}
}
$file->close_stream();
}
$to_cache = array(
'query' => $query,
'results' => $matched_lines,
);
wp_cache_set( $cache_key, $to_cache, self::CACHE_GROUP, DAY_IN_SECONDS );
}
if ( true === $count_only ) {
return count( $matched_lines );
}
return array_slice( $matched_lines, $args['offset'], $args['per_page'] );
}