Task 543: .PHP3 File Format

Task 543: .PHP3 File Format

File Format Specifications for .PHP3

The .php3 file extension is associated with PHP 3 web pages, an older version of PHP scripts from the late 1990s. It is not a structured binary file format with specific headers or encoding schemes; instead, it is a plain text file containing PHP code that is parsed and executed by a web server with a PHP engine installed. The code typically starts with <? or <?php and ends with ?>. There are no formal "file format" specifications beyond being a text file adhering to PHP 3 syntax. For reference, the PHP 3 documentation (archived) describes the language, but the file itself is simply text-based, often in ASCII or UTF-8 encoding. MIME type is usually application/x-httpd-php3 or text/php.

List of all the properties of this file format intrinsic to its file system:

  • File name
  • File path (absolute or relative)
  • File size (in bytes)
  • Creation time
  • Last modification time
  • Last access time
  • Permissions (mode, e.g., octal representation like 0644)
  • Owner user ID (UID)
  • Owner group ID (GID)
  • Inode number (on Unix-like systems)
    Note: These are standard file system metadata properties applicable to any file, including .php3 files, as there are no format-specific intrinsic properties beyond the extension and text nature.

Two direct download links for files of format .PHP3:

Ghost blog embedded HTML JavaScript for drag and drop .PHP3 file to dump properties:

PHP3 File Properties Dumper
Drag and drop .php3 file here

This HTML can be embedded in a Ghost blog post via the HTML card/block.

  1. Python class for .PHP3 files:
import os
import time
import stat

class PHP3FileHandler:
    def __init__(self, filepath):
        self.filepath = filepath
        if not self.filepath.endswith('.php3'):
            raise ValueError("File must have .php3 extension")
        self.stats = os.stat(self.filepath)

    def read_content(self):
        with open(self.filepath, 'r') as f:
            return f.read()  # Read as text, no decode needed beyond text

    def write_content(self, content):
        with open(self.filepath, 'w') as f:
            f.write(content)  # Write text
        self.stats = os.stat(self.filepath)  # Update stats after write

    def print_properties(self):
        print(f"File name: {os.path.basename(self.filepath)}")
        print(f"File path: {os.path.abspath(self.filepath)}")
        print(f"File size: {self.stats.st_size} bytes")
        print(f"Creation time: {time.ctime(self.stats.st_birthtime) if hasattr(self.stats, 'st_birthtime') else 'Not available'}")
        print(f"Last modification time: {time.ctime(self.stats.st_mtime)}")
        print(f"Last access time: {time.ctime(self.stats.st_atime)}")
        print(f"Permissions: {oct(self.stats.st_mode & 0o777)}")
        print(f"Owner UID: {self.stats.st_uid}")
        print(f"Group GID: {self.stats.st_gid}")
        print(f"Inode number: {self.stats.st_ino}")

# Example usage:
# handler = PHP3FileHandler('example.php3')
# print(handler.read_content())
# handler.write_content('<?php echo "Hello"; ?>')
# handler.print_properties()
  1. Java class for .PHP3 files:
import java.io.*;
import java.nio.file.*;
import java.nio.file.attribute.*;
import java.time.Instant;

public class PHP3FileHandler {
    private Path path;
    private BasicFileAttributes attrs;

    public PHP3FileHandler(String filepath) throws IOException {
        this.path = Paths.get(filepath);
        if (!filepath.endsWith(".php3")) {
            throw new IllegalArgumentException("File must have .php3 extension");
        }
        this.attrs = Files.readAttributes(path, BasicFileAttributes.class);
    }

    public String readContent() throws IOException {
        return new String(Files.readAllBytes(path));  // Read as text
    }

    public void writeContent(String content) throws IOException {
        Files.write(path, content.getBytes());  // Write text
        this.attrs = Files.readAttributes(path, BasicFileAttributes.class);  // Update attrs
    }

    public void printProperties() throws IOException {
        PosixFileAttributes posixAttrs = null;
        try {
            posixAttrs = Files.readAttributes(path, PosixFileAttributes.class);
        } catch (UnsupportedOperationException e) {
            // Posix not supported (e.g., Windows)
        }

        System.out.println("File name: " + path.getFileName());
        System.out.println("File path: " + path.toAbsolutePath());
        System.out.println("File size: " + attrs.size() + " bytes");
        System.out.println("Creation time: " + Instant.ofEpochMilli(attrs.creationTime().toMillis()));
        System.out.println("Last modification time: " + Instant.ofEpochMilli(attrs.lastModifiedTime().toMillis()));
        System.out.println("Last access time: " + Instant.ofEpochMilli(attrs.lastAccessTime().toMillis()));
        if (posixAttrs != null) {
            System.out.println("Permissions: " + posixAttrs.permissions());
            System.out.println("Owner: " + posixAttrs.owner().getName());
            System.out.println("Group: " + posixAttrs.group().getName());
        } else {
            System.out.println("Permissions, Owner, Group: Not available (non-Posix FS)");
        }
        if (posixAttrs != null) {
            System.out.println("Inode number: " + attrs.fileKey());  // Approximation
        } else {
            System.out.println("Inode number: Not available");
        }
    }

    // Example usage:
    // public static void main(String[] args) throws IOException {
    //     PHP3FileHandler handler = new PHP3FileHandler("example.php3");
    //     System.out.println(handler.readContent());
    //     handler.writeContent("<?php echo \"Hello\"; ?>");
    //     handler.printProperties();
    // }
}
  1. JavaScript class (for Node.js) for .PHP3 files:
const fs = require('fs');
const path = require('path');

class PHP3FileHandler {
    constructor(filepath) {
        if (!filepath.endsWith('.php3')) {
            throw new Error('File must have .php3 extension');
        }
        this.filepath = filepath;
        this.stats = fs.statSync(this.filepath);
    }

    readContent() {
        return fs.readFileSync(this.filepath, 'utf8');  // Read as text
    }

    writeContent(content) {
        fs.writeFileSync(this.filepath, content, 'utf8');  // Write text
        this.stats = fs.statSync(this.filepath);  // Update stats
    }

    printProperties() {
        console.log(`File name: ${path.basename(this.filepath)}`);
        console.log(`File path: ${path.resolve(this.filepath)}`);
        console.log(`File size: ${this.stats.size} bytes`);
        console.log(`Creation time: ${this.stats.birthtime}`);
        console.log(`Last modification time: ${this.stats.mtime}`);
        console.log(`Last access time: ${this.stats.atime}`);
        console.log(`Permissions: ${this.stats.mode.toString(8)}`);
        console.log(`Owner UID: ${this.stats.uid}`);
        console.log(`Group GID: ${this.stats.gid}`);
        console.log(`Inode number: ${this.stats.ino}`);
    }
}

// Example usage:
// const handler = new PHP3FileHandler('example.php3');
// console.log(handler.readContent());
// handler.writeContent('<?php echo "Hello"; ?>');
// handler.printProperties();
  1. C class (using C++ for class support) for .PHP3 files:
#include <iostream>
#include <fstream>
#include <string>
#include <sys/stat.h>
#include <ctime>
#include <unistd.h>  // For UID/GID on Unix-like

class PHP3FileHandler {
private:
    std::string filepath;
    struct stat stats;

public:
    PHP3FileHandler(const std::string& fp) : filepath(fp) {
        if (filepath.substr(filepath.find_last_of(".") + 1) != "php3") {
            throw std::invalid_argument("File must have .php3 extension");
        }
        if (stat(filepath.c_str(), &stats) != 0) {
            throw std::runtime_error("Failed to get file stats");
        }
    }

    std::string readContent() {
        std::ifstream file(filepath);
        if (!file) {
            throw std::runtime_error("Failed to open file for reading");
        }
        std::string content((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
        return content;
    }

    void writeContent(const std::string& content) {
        std::ofstream file(filepath);
        if (!file) {
            throw std::runtime_error("Failed to open file for writing");
        }
        file << content;
        if (stat(filepath.c_str(), &stats) != 0) {  // Update stats
            throw std::runtime_error("Failed to get updated file stats");
        }
    }

    void printProperties() {
        std::cout << "File name: " << filepath.substr(filepath.find_last_of("/\\") + 1) << std::endl;
        std::cout << "File path: " << std::string(std::filesystem::absolute(filepath)) << std::endl;  // C++17
        std::cout << "File size: " << stats.st_size << " bytes" << std::endl;
        std::cout << "Creation time: " << std::ctime(&stats.st_ctime);
        std::cout << "Last modification time: " << std::ctime(&stats.st_mtime);
        std::cout << "Last access time: " << std::ctime(&stats.st_atime);
        std::cout << "Permissions: " << std::oct << (stats.st_mode & 0777) << std::dec << std::endl;
        std::cout << "Owner UID: " << stats.st_uid << std::endl;
        std::cout << "Group GID: " << stats.st_gid << std::endl;
        std::cout << "Inode number: " << stats.st_ino << std::endl;
    }
};

// Example usage:
// int main() {
//     try {
//         PHP3FileHandler handler("example.php3");
//         std::cout << handler.readContent() << std::endl;
//         handler.writeContent("<?php echo \"Hello\"; ?>");
//         handler.printProperties();
//     } catch (const std::exception& e) {
//         std::cerr << e.what() << std::endl;
//     }
//     return 0;
// }