Runs.php 3.12 KB
<?php
/**
 * Created by PhpStorm.
 * User: Zip
 * Date: 2/22/15
 * Time: 3:02 PM
 */

namespace Hood\Debug\XHProf;


class Runs
{
    private $dir = '';

    private $suffix = 'xhprof';

    public function __construct($dir = null)
    {
        if (empty($dir)) {
            $dir = ini_get("xhprof.output_dir");
            if (empty($dir)) {
                $dir = "/tmp";
                $this->xhprof_error("Warning: Must specify directory location for XHProf runs. " .
                    "Trying {$dir} as default. You can either pass the " .
                    "directory location as an argument to the constructor " .
                    "for XHProfRuns_Default() or set xhprof.output_dir " .
                    "ini param.");
            }
        }
        $this->dir = $dir;
    }

    private function gen_run_id($type)
    {
        return md5(uniqid('', true) . posix_getpid() . gethostname() . mt_rand(1, 0x7FFFFF));
    }

    private function file_name($run_id, $type)
    {
        $file = "$run_id.$type." . $this->suffix;
        if (!empty($this->dir)) {
            $file = $this->dir . "/" . $file;
        }
        $dir = dirname($file);
        if (file_exists($dir) == false) {
            mkdir($dir, 0, true);
        }
        return $file;
    }


    public function get_run($run_id, $type, &$run_desc)
    {
        $file_name = $this->file_name($run_id, $type);
        if (!file_exists($file_name)) {
            $this->xhprof_error("Could not find file $file_name");
            $run_desc = "Invalid Run Id = $run_id";
            return null;
        }
        $contents = file_get_contents($file_name);
        $run_desc = "XHProf Run (Namespace=$type)";
        return unserialize($contents);
    }

    public function save_run($xhprof_data, $type, $run_id = null)
    {
        $xhprof_data = serialize($xhprof_data);
        if ($run_id === null) {
            $run_id = $this->gen_run_id($type);
        }
        $file_name = $this->file_name($run_id, $type);
        $file = fopen($file_name, 'w');
        if ($file) {
            fwrite($file, $xhprof_data);
            fclose($file);
        } else {
            $this->xhprof_error("Could not open $file_name\n");
        }
        // echo "Saved run in {$file_name}.\nRun id = {$run_id}.\n";
        return $run_id;
    }

    function list_runs()
    {
        if (is_dir($this->dir)) {
            echo "<hr/>Existing runs:\n<ul>\n";
            $files = glob("{$this->dir}/*.{$this->suffix}");
            usort($files, create_function('$a,$b', 'return filemtime($b) - filemtime($a);'));
            foreach ($files as $file) {
                list($run, $source) = explode('.', basename($file));
                echo '<li><a href="' . htmlentities($_SERVER['SCRIPT_NAME'])
                    . '?run=' . htmlentities($run) . '&source='
                    . htmlentities($source) . '">'
                    . htmlentities(basename($file)) . "</a><small> "
                    . date("Y-m-d H:i:s", filemtime($file)) . "</small></li>\n";
            }
            echo "</ul>\n";
        }
    }

    public function xhprof_error($message)
    {
        error_log($message);
    }
}